【发布时间】: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(),我不需要返回任何东西?非常感谢任何输入。谢谢。
【问题讨论】:
-
我发现这是一篇很好的文章,解释了与 Promise 的混淆We have a problem with promises
-
Tomalak,ivn:谢谢,去看看。
-
你可能想看看my rules of thumb 的承诺
-
@Bergi 会的,谢谢。
标签: javascript node.js promise bluebird passport.js