Nodejs 不会将散列密码保存到 mysql db

Nodejs doesn't save hashed password to mysql db

NodeJS 新手,尝试自己编写用户注册,但在应用保存非散列密码时遇到麻烦。尝试在保存之前检查密码是否经过哈希处理,并且警告说是。这是我的代码:

var userData = {
        email: req.body.email,
        password: req.body.password
    }

        var user = userData;

        bcrypt.hash(user.password, 10, function(err, hash){
                if(err) console.log(err);
                user.password = hash;
                alert(user.password); //shows hashed password
            });

        //skipped connection code

        database.connection.query("insert into users set ?", user, function(err){ //saves non-hashed password
            if(err) console.log(err);
            console.log("successfull");

        });

bcrypt.hash 是异步的。您的代码中存在本质上的竞争条件。

    database.connection.query("insert into users set ?", user, function(err){ //saves non-hashed password
        if(err) console.log(err);
        console.log("successfull");

    });

当您将 user 传递给此方法时,user.password 尚未被 bcrypt.hash 回调填充。

如果你坚持面向回调的风格,你需要将查询逻辑放在 bcrypt 回调中,尽管大多数 javascript 开发者可能会使用 promises 或 async/await(在最近的版本中应该是本地可用的) Node.js).

    bcrypt.hash(user.password, 10, function(err, hash){
            if(err) console.log(err);
            user.password = hash;
            alert(user.password); //shows hashed password

            //>>query logic should go here.
        });

看来您需要将数据库查询放在回调中。尝试这样的事情:

    var userData = {
       email: req.body.email,
       password: req.body.password
    }

    var user = userData;

    bcrypt.hash(user.password, 10, function(err, hash){
         if(err) console.log(err);
         user.password = hash;
         database.connection.query("insert into users set ?", 
            user, function(err){ //saves non-hashed password
            if(err) console.log(err);
            console.log("successfull");
        });
    });

Node.js 就是那样的异步。这就是为什么有回调函数。在对密码进行哈希处理或这些事件同时发生之前,您正在插入用户。基本上,你有一个竞争条件。