node.js - 在 Nodejs 中更改密码实现
问题描述
我正在尝试在我的 nodejs 应用程序中实现更改密码功能。当我将旧密码与数据库中的哈希密码进行比较时,我的问题是 if 语句的else 。我想引用/返回回调,就像密码匹配时一样,并更新可能数据库中的密码。这样我就可以检查它在我的控制器中是否成功/失败。
//route file
router.post("/change-password", auth.authenticationMiddleware(), auth.change);
//controller
module.exports.change = (req, res, next) => {
if (req.body.new === req.body.confirm){
let user = {
id : req.user.id,
old : req.body.current,
new : req.body.new
};
users.changePassword(user, (err, result)=> {
if (err) throw err;
console.log(result)
});
res.redirect("/");
}else{
res.redirect("/change-password");
}
};
//model
module.exports.changePassword = (user, callback) => {
db.query("SELECT password FROM users WHERE id=?",[user.id], (error, result) => {
if (error) throw error;
bcrypt.compare(user.current, result[0].password, (err, match) => {
if (match){
bcrypt.hash(user.new, saltRounds, function (er, hash) {
db.query("UPDATE users SET password=? WHERE id=?", [hash, user.id], callback);
});
}else {
//callback
}
});
});
};
解决方案
您应该将错误向上传递而不是抛出它们。Error
当密码不匹配时,您也可以自己制作。
//model
module.exports.changePassword = (user, callback) => {
db.query("SELECT password FROM users WHERE id=?",[user.id], (error, result) => {
if (error) return callback(error); // pass to caller
bcrypt.compare(user.current, result[0].password, (err, match) => {
if (err) return callback(err); // pass this one too!
if (match){
bcrypt.hash(user.new, saltRounds, function (er, hash) {
if (er) return callback(er); // and this one!!
db.query("UPDATE users SET password=? WHERE id=?", [hash, user.id], callback);
});
}else {
// that's not good, send an error to the caller
var err = new Error('Password does not match');
err.code = 'BAD_PASSWORD';
callback(err);
}
});
});
};
在控制器中,您可以检查该错误并将任何其他错误传递给下一个错误处理路由。您可能还希望在重定向用户之前等待调用回调。
//controller
module.exports.change = (req, res, next) => {
if (req.body.new === req.body.confirm){
let user = {
id : req.user.id,
old : req.body.current,
new : req.body.new
};
users.changePassword(user, (err, result)=> {
if (err) {
if (err.code === 'BAD_PASSWORD') {
// do something
} else {
next(err); // pass the error to the next handler
}
} else {
res.redirect("/");
}
});
}else{
res.redirect("/change-password");
}
};
推荐阅读
- python - 无法使用请求从网页中抓取 csrf 令牌(在页面源中可用)
- android - 如何使用 Kotlin 中的循环从 JSON 数组打印键值?
- python - Python八进制转十进制
- activecampaign - 是否有 API 驱动的方法来检索 ActiveCampaign 的邮件指标?
- node.js - 在 Typescript 中嵌套一个键的对象组数组
- spring - 如何从其他(Postgres)数据库加载内存数据库中的数据?
- python - 如何将 gee s2_sr 图像从 colab 批量下载到我的谷歌驱动器
- vaadin - 如何将 javascript 文件包含到 Vaadin 14 litlement 组件中
- html - Angular 10 - 如果用户编辑,使用字符串插值填充的 TextArea 无法正确显示
- python - 当 False 时使 tkinter ttk checkbutton 为空