Javascript 无法创建以顺序方式执行函数的顺序
我在节点Mongo环境上。我正在将字符串密码转换为bcrypt。在此之后,将其保存到数据库。但存在一个问题,即Bcrypt和之后的函数不能按顺序运行。为此,我使用SetTimeout()函数来稍微晚一点运行另一个函数 但据我所知,这不是一个好的做法。假设Bcrypt无论如何都需要时间,并且在该计时器函数调用另一个之后,可能会发生冲突 我的代码如下:Javascript 无法创建以顺序方式执行函数的顺序,javascript,node.js,bcrypt,Javascript,Node.js,Bcrypt,我在节点Mongo环境上。我正在将字符串密码转换为bcrypt。在此之后,将其保存到数据库。但存在一个问题,即Bcrypt和之后的函数不能按顺序运行。为此,我使用SetTimeout()函数来稍微晚一点运行另一个函数 但据我所知,这不是一个好的做法。假设Bcrypt无论如何都需要时间,并且在该计时器函数调用另一个之后,可能会发生冲突 我的代码如下: var globalpasswordholder; bcrypt.genSalt(10, function(err, salt) {
var globalpasswordholder;
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(req.body.password, salt, function(err, hash) {
req.body.password = hash;
globalpasswordholder = req.body.password;
});
});
setTimeout(function(){
user.password = globalpasswordholder;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function(err) {
req.logIn(user, function(err) {
done(err, user);
});
});
},1000);
如果我没有使用setTimeout函数,那么在控制台上我的globalpasswordholder是未定义的
任何人都有解决这个问题的办法。提前感谢。因为javascript是单线程的,所以genSalt()将被推送到事件循环中,它不会等待响应并跳转到下一个语句。在gensalt()完成执行后,它的回调函数(err,hash){…}代码>将被执行。在genSalt()方法的回调中编写代码,如下所示:
bcrypt.genSalt(10, function (err, salt) {
bcrypt.hash(req.body.password, salt, function (err, hash) {
req.body.password = hash;
globalpasswordholder = req.body.password;
user.password = globalpasswordholder;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function (err) {
req.logIn(user, function (err) {
done(err, user);
});
});
});
});
var globalpasswordholder;
bcrypt.genSalt(10)
.then(salt => {
return bcrypt.hash(req.body.password, salt);
})
.then(hash => {
req.body.password = hash;
globalpasswordholder = req.body.password;
user.password = globalpasswordholder;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
return user.save();
})
.then(() => {
req.logIn(user, function (err) {
done(err, user);
});
})
.catch(e => console.log(e));
并且bcrypt.genSalt还提供了promisified方法,因此您也可以这样使用它:
bcrypt.genSalt(10, function (err, salt) {
bcrypt.hash(req.body.password, salt, function (err, hash) {
req.body.password = hash;
globalpasswordholder = req.body.password;
user.password = globalpasswordholder;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function (err) {
req.logIn(user, function (err) {
done(err, user);
});
});
});
});
var globalpasswordholder;
bcrypt.genSalt(10)
.then(salt => {
return bcrypt.hash(req.body.password, salt);
})
.then(hash => {
req.body.password = hash;
globalpasswordholder = req.body.password;
user.password = globalpasswordholder;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
return user.save();
})
.then(() => {
req.logIn(user, function (err) {
done(err, user);
});
})
.catch(e => console.log(e));
这是理解概念的好方法。只需将与用户相关的代码放入bcrypt的回调函数中即可
var globalpasswordholder;
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(req.body.password, salt, function(err, hash) {
req.body.password = hash;
globalpasswordholder = req.body.password;
user.password = globalpasswordholder;
user.resetPasswordToken = undefined;
user.resetPasswordExpires = undefined;
user.save(function(err) {
req.logIn(user, function(err) {
done(err, user);
});
});
});
});
可能重复的
bcrypt.hash
返回承诺,因此您需要一个then
。一切都在感谢你@Ridham Tarpara。同样感谢分享视频教程……在第二个示例中,如果您返回bcrypt.hash
和user.save
的结果,您就可以链接承诺(then
),这将产生更干净的代码。我实际上是这样想的。这是一个小问题。