Node.js不会将哈希密码保存到mysql数据库

时间:2018-07-07 20:05:50

标签: node.js bcrypt

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");

        });

2 个答案:

答案 0 :(得分:2)

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编写者可能会使用Promise或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.
        });

答案 1 :(得分:1)

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

    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是异步的。这就是为什么有回调函数的原因。您在散列密码或这些事件同时发生之前正在插入用户。基本上,您有比赛条件。