$ and运算符始终返回true,即使我认为应该为假

时间:2019-04-19 15:25:38

标签: mongodb

我尝试设置重置密码功能。用户将在电子邮件中收到包含令牌的链接,以重置密码。链接看起来像这样:

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

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

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

  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');
        })


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

谢谢。对不起,英语不好。

1 个答案:

答案 0 :(得分:0)

如果查询不匹配,

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