Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法创建以顺序方式执行函数的顺序_Javascript_Node.js_Bcrypt - Fatal编程技术网

Javascript 无法创建以顺序方式执行函数的顺序

Javascript 无法创建以顺序方式执行函数的顺序,javascript,node.js,bcrypt,Javascript,Node.js,Bcrypt,我在节点Mongo环境上。我正在将字符串密码转换为bcrypt。在此之后,将其保存到数据库。但存在一个问题,即Bcrypt和之后的函数不能按顺序运行。为此,我使用SetTimeout()函数来稍微晚一点运行另一个函数 但据我所知,这不是一个好的做法。假设Bcrypt无论如何都需要时间,并且在该计时器函数调用另一个之后,可能会发生冲突 我的代码如下: var globalpasswordholder; bcrypt.genSalt(10, function(err, salt) {

我在节点Mongo环境上。我正在将字符串密码转换为bcrypt。在此之后,将其保存到数据库。但存在一个问题,即Bcrypt和之后的函数不能按顺序运行。为此,我使用SetTimeout()函数来稍微晚一点运行另一个函数

但据我所知,这不是一个好的做法。假设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;
                });
            });
            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
),这将产生更干净的代码。我实际上是这样想的。这是一个小问题。