mongodb - $and 运算符总是返回 true,即使我认为它应该是 false
问题描述
我尝试设置重置密码功能。用户将在其电子邮件中收到一个链接,其中包含重置密码的令牌。链接如下所示:
http://localhost:3000/api/users/reset?token=dasdasad&id=5cb99eee1e7de74d69bbf426
其中 token 是由 crypto.randombyte 生成的秘密重置令牌,ID 是用户的对象 ID。
这是我重置密码功能的步骤:
- 验证用户的输入
- 检查用户提供的秘密令牌是否与我的数据库中的相同
- 如果是,则更新用户密码
- 删除存储在我的数据库中的重置令牌
我尝试在一个查询中执行步骤 2 - 4,但它不起作用。即使重置令牌错误,用户也总是能够以某种方式更新他们在数据库中的密码。
这是我的代码
// setup find criteria
const criteria = {
$and: [
{_id: oid},
{reset_token: query.token}
]
}
// hashing new password
bcrypt.genSalt(saltRounds, (error, salt) => {
bcrypt.hash(form.newPassword, salt, (error, hash) => {
form.newPassword = hash;
// update new password into DB and delete reset token
users.updateOne(criteria, {$set:{password:form.newPassword}, $unset:{reset_token:""}} )
.then(response => {
return res.status(201).json(`Your password has been reset successfully!`);
})
.catch(error => res.status(500).json('Sorry something is wrong. Please try again later.'));
});
})
.catch(error => {
res.status(500).json('Sorry something is wrong, please try again later or contact us for further assistance');
})
我希望当用户给出错误的令牌时,用户会收到一条错误消息并且无法更新数据库。
谢谢你。抱歉英语不好。
解决方案
updateOne
如果查询不匹配,则不会失败。即使它不匹配任何行,catch
也不会被调用。这是为真正的灾难性故障(例如数据库连接失败)保留的。如果您想知道某行是否已更新,.modifiedCount
请检查.matchedCount
.response
.then
推荐阅读
- python-3.x - 如何形成连通分量的三元组以形成无向图?
- c# - OWIN WebAPI 简单注入器 EFCoreInMemoryDB 注入
- angular - ListView 不会一次呈现所有项目
- sql - 使用连接 SQL 更新表的所有行
- twig - 在 Twig 中创建具有变量 Key 的对象
- php - Laravel - 从另一个模型获取模型属性
- c# - MongoDB c#使用定义生成器检索文档内数组中的所有匹配元素
- python - 遵循约定重写代码的困难
- javascript - 类型 'void' 必须有一个返回迭代器的 '[Symbol.iterator]()' 方法
- rdf - 个人创建的耶拿在写入文件时没有类