首页 > 解决方案 > 在 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
            }
        });
    });

};

标签: node.js

解决方案


您应该将错误向上传递而不是抛出它们。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");
    }

};

推荐阅读