【发布时间】:2017-10-25 06:03:05
【问题描述】:
我开始使用异步/等待。一般来说,将 await 与中间件 done/next 函数一起使用的模式是什么?
例如,如何将下面代码中的 .then() 替换为 await? localAuthenticate 完成/下一个中间件。我是否需要单独创建一个async 函数才能在其中使用await?
我想要这样的东西(没有 try/catch 更好):
function localAuthenticate(User, email, password, hostname, done) {
try { // where is async?
// Find user
let user = await User.findOne({ email: email.toLowerCase() }).exec()
if(!user) return done(null, false, { message: 'This email is not registered.' });
// Test password
user.authenticate(password, function(authError, authenticated) {
if(authError) return done(authError);
if(!authenticated) return done(null, false, { message: 'This password is not correct.' });
return done(null, user);
});
} catch(err) { done(err); }
}
来自 Passport.js 认证中间件的原始代码:
function localAuthenticate(User, email, password, hostname, done) {
User.findOne({
email: email.toLowerCase()
}).exec()
.then(user => {
if(!user) {
return done(null, false, {
message: 'This email is not registered.'
});
}
user.authenticate(password, function(authError, authenticated) {
if(authError) {
return done(authError);
}
if(!authenticated) {
return done(null, false, { message: 'This password is not correct.' });
} else {
return done(null, user);
}
});
})
.catch(err => done(err));
}
【问题讨论】:
标签: node.js express async-await passport-local