【问题标题】:Confused about promises. Do I need to return here?对承诺感到困惑。我需要回到这里吗?
【发布时间】:2017-05-16 13:30:45
【问题描述】:

所以我最近开始学习 Promises (Bluebird),现在我正在尝试尽可能多地使用它们,但是在这种情况下我是否需要返回 Promise,我有点困惑。

我在这里制作了一个 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 库返回一个promise,如果在数据库中找到一个用户,该promise 将解析为用户,如果未找到该用户,则返回false。

B 行的bcrypt.compare 使用bcrypt 检查密码和哈希是否匹配。它返回一个将解析为真或假的承诺。

代码完美运行,我只是对 A 行和 B 行是否应该像这样返回感到困惑

return users.get(username) // A

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

代码在返回和不返回承诺的情况下都有效。

Passport/Node 是否只是等到它看到return done?这是否意味着这个函数是同步的,即使它里面的一切都是异步的?通常你会返回一个承诺,然后在上面使用.then(),但由于LocalStrategy 没有使用.then().catch(),我不需要返回任何东西?非常感谢任何输入。谢谢。

【问题讨论】:

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


【解决方案1】:

Passport 不支持 Promise,这就是为什么您必须在回调中调用 done。您可以return users.get(username),但从不使用返回值(承诺)。不要忘记你可以像下面这样链接承诺:

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

【讨论】:

  • 好的,谢谢。我认为在这种情况下可能无关紧要,因为 Passport 不在乎。我只是想知道返回是否有任何伤害,但我想没有。我没有像您的示例中那样链接的原因是因为 bcrypt.compare 不返回用户,它只返回 true 或 false 所以我在 .then() users.get(username) 之后无法返回用户。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多