Node.js Bluebird promise作为promise api的回调
我想向passport的done回调函数传递一个承诺。如果我使用Node.js Bluebird promise作为promise api的回调,node.js,promise,passport.js,bluebird,Node.js,Promise,Passport.js,Bluebird,我想向passport的done回调函数传递一个承诺。如果我使用bluebirdpromise库,我将如何处理这个问题 我知道有一个promission主题,有一个asCallback和fromCallback,但我不能从示例中得到这个想法 exports.signup = new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true },
bluebird
promise库,我将如何处理这个问题
我知道有一个promission主题,有一个asCallback
和fromCallback
,但我不能从示例中得到这个想法
exports.signup = new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
(req, email, password, done) => {
...
return done(null, false, {type: 'warning', message: 'Email is in use.'})
...
}
);
编辑:
这就是我想要实现的目标:
exports.signup = new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true,
passportLocalCallback
});
function passportLocalCallback(req, email, password, done) {
return new Pormise((resolve, reject) => {
return User.findOneAsync({email: email});
})
.then((existingUser) => {
if (existingUser) {
resolve([null, false, {type: 'warning', message: 'That email is already taken.'}])
}
return User.generateHash(password);
})
.then((hash) => {
return User.createAsync({
email: email,
password: hash
})
})
.catch((err) => reject(err));
}
我不认为你能让它和promisification工具一起工作,主要是因为Passport也有一个有效的3参数回调情况,这是Bluebird不知道的(我想) 目前我能想到的唯一解决方案是:
function passportLocalCallback(req, email, password, done) {
User.findOneAsync({ email : email }).then((existingUser) => {
if (existingUser) {
return done(null, false, {type: 'warning', message: 'That email is already taken.'});
}
return User.generateHash(password).then( (hash) => {
return User.createAsync({
email : email,
password : hash
})
}).then( (user) => {
return done(null, user);
});
}).catch((err) => done(err));
}
编辑:使用asCallback()
会将代码缩短一点,但在我看来,这并不是一件简单的事情:
function passportLocalCallback(req, email, password, done) {
User.findOneAsync({ email : email }).then((existingUser) => {
if (existingUser) {
return [ false, { type: 'warning', message: 'That email is already taken.' } ];
}
return User.generateHash(password).then( (hash) => {
return User.createAsync({
email : email,
password : hash
})
});
}).asCallback(done, { spread : true });
}
(未测试)我不确定这是否有效,因为Passport要求使用特定参数调用
done()
(如果身份验证成功,则表示用户的对象;如果身份验证失败,则表示错误的对象)。你能详细说明你到底想做什么吗(比如,承诺从哪里来)。@robertklep我更新了问题,希望现在问题更清楚了。我很确定这可以通过bluebird promisification utils实现,但不清楚如何实现。new Pormise((解析,拒绝)=>{return User.findOneAsync({email:email});})
肯定是错误的。不仅是因为打字错误,而且因为你不能从构造函数回调返回任何东西。啊,我明白了,所以在构造函数cb中,我不需要使用return
,因为它将首先出现在中,然后出现在中。但这意味着我将不得不在许多场景中混合回调风格和承诺,我认为这会造成很多混乱。我希望asCallback
的用例能够解决这样的问题。对于多个参数,还有一个扩展选项@我编辑了我的答案以使用asCallback()