所以我最近开始学习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。
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()
我不需要返回任何内容?任何输入都非常感谢。感谢。
答案 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);
});