我正在尝试在我的nodejs应用程序中实现更改密码功能。当我比较数据库中哈希密码中的旧密码时,我的问题是if语句的 else 。我想参考/返回回调,就像匹配密码时一样,并在may数据库中更新密码。这样我就可以在控制器中检查它是否成功。
//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
}
});
});
};
答案 0 :(得分:0)
您应该将错误传递给上游,而不是将其抛出。如果密码不匹配,您也可以自己制作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");
}
};