更改Node.js中的密码实现

时间:2018-09-19 06:23:35

标签: node.js

我正在尝试在我的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
            }
        });
    });

};

1 个答案:

答案 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");
    }

};