首页 > 解决方案 > $and 运算符总是返回 true,即使我认为它应该是 false

问题描述

我尝试设置重置密码功能。用户将在其电子邮件中收到一个链接,其中包含重置密码的令牌。链接如下所示:

http://localhost:3000/api/users/reset?token=dasdasad&id=5cb99eee1e7de74d69bbf426

其中 token 是由 crypto.randombyte 生成的秘密重置令牌,ID 是用户的对象 ID。

这是我重置密码功能的步骤:

  1. 验证用户的输入
  2. 检查用户提供的秘密令牌是否与我的数据库中的相同
  3. 如果是,则更新用户密码
  4. 删除存储在我的数据库中的重置令牌

我尝试在一个查询中执行步骤 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');
        })


我希望当用户给出错误的令牌时,用户会收到一条错误消息并且无法更新数据库。

谢谢你。抱歉英语不好。

标签: mongodb

解决方案


updateOne如果查询不匹配,则不会失败。即使它不匹配任何行,catch也不会被调用。这是为真正的灾难性故障(例如数据库连接失败)保留的。如果您想知道某行是否已更新,.modifiedCount请检查.matchedCount.response.then


推荐阅读