Node JS - 使用 findOneAndUpdate 和 Bcrypt 更新密码

Node JS - Updating password with findOneAndUpdate and Bcrypt

我是 Node.js 的新手,我正在尝试更新个人资料页面,以便用户可以输入旧通行证和新通行证,然后在数据库中进行更新

我正在使用 findOneAndUpdate 并试图想出一个方法来:

1 找到用户

2 获取用户通行证

3 比较旧pass与DB中的pass

4 散列新通行证

5 更新用户

我想不出用 findOneAndUpdate 做这个的方法?

exports.updateUser = (req, res) => {
  const {id, username, email, oldPassword, newPassword} = req.body

  const v = new Validator()
  const schema = {
    username: { type: "string" },
    email: { type: "email" },
  }
  const errors = v.validate({ username, email }, schema)
  if (errors.length) {
    return res.status(400).json({ errors })
  }

  if (!oldPassword && !newPassword) {
    const filter = { _id: id }
    const update = { username, email}
    
    userModel.findOneAndUpdate(filter, update, {new: true})
      .then( user => {
        if (user) {
          res.json({message: "User is updated."})
        } else {
          res.status(400).json({error: "Failed to update user."})
        }
      })
  } else if (oldPassword && newPassword) { // this is the part I can't make
    const filter = { _id: id }
    const update = { username, email, oldPassword, newPassword}
    
    userModel.findOneAndUpdate(filter, update, {new: true})
       // here I need to check if the old pass is good first, then update it with the new hashed pass
      .then( user => {
        if (user) {
          res.json({message: "User is updated."})
        } else {
          res.status(400).json({error: "Failed to update user."})
        }
      })
  }

}

findOneAndUpdate 不能单独完成您正在寻找的事情。它只会找到一条记录并立即更新它 - 您无法对记录的当前内容进行任何类型的检查。

您需要按照 findOne 的方式做一些事情来检索当前用户记录,检查数据库中的密码是否与新密码匹配,然后使用 findOneAndUpdate 来如果密码符合您的条件,请更新密码。

此外,请允许我添加一个强制性提醒,永远不要将您的用户密码明文存储在数据库中。您应该查找密码散列最佳实践并实施这些实践,但这超出了本文 question/answer.

的范围