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.
的范围
我是 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.
的范围