对承诺感到困惑。我需要回到这里吗?

时间:2017-01-02 12:29:13

标签: javascript node.js promise bluebird passport.js

所以我最近开始学习Promises(Bluebird),现在我试图尽可能地使用它们,但是如果我需要在这种情况下返回承诺,我会有点困惑。

我在这里制作了Passport LocalStrategy:

passport.use(new LocalStrategy(function(username, password, done) {
    users.get(username) // A
        .then(function(user) {
            if (!user) {
                return done(null, false, { message: 'Incorrect username.' });
            }
            bcrypt.compare(password, user.password).then(function(result) { // B
                if (result) {
                    return done(null, user);
                }
                return done(null, false, { message: 'Incorrect password.' });
            });
        })
        .catch(function(err) {
            return done(err);
        });
}));
第A行上的

users.get(username)使用pg-promise库返回一个承诺,如果在数据库中找到一个将解析为用户,如果找不到该用户则返回false。

第B行的

bcrypt.compare使用bcrypt来检查密码和哈希是否匹配。它返回一个将解析为true或false的promise。

代码完美无缺,如果A行和B行应该返回

,我感到很困惑
return users.get(username) // A

return bcrypt.compare(password, user.password).then(function(result) { // B

代码可以使用和不使用返回承诺。

Passport / Node是否只等到return done?这是否意味着即使内部的所有内容都是异步的,此函数也是同步的?通常你会返回一个promise,然后使用.then(),但由于LocalStrategy没有使用.then().catch()我不需要返回任何内容?任何输入都非常感谢。感谢。

1 个答案:

答案 0 :(得分:0)

Passport不支持Promise,这就是你必须在回调中调用done的原因。你可以return users.get(username)但是从不使用返回值(promise)。不要忘记你可以链接如下的承诺:

users.get(username)
    .then(function(user) {
        if (!user) {
            return done(null, false, { message: 'Incorrect username.' });
        }
        return bcrypt.compare(password, user.password);
   })
   .then(function(result) { // B
        if (result) {
            return done(null, user);
        }
        return done(null, false, { message: 'Incorrect password.' });
    })
    .catch(function(err) {
        return done(err);
    });