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