将 async/await 与 done()/next() 中间件函数一起使用
Using async/await with done()/next() middleware functions
我开始使用 async/await。通常,await 与中间件 done/next 函数一起使用的模式是什么?
例如,我如何将下面代码中的.then()替换为await? localAuthenticate
是 done/next 中间件。我需要制作一个单独的 async
函数才能在其中使用 await
吗?
我想要这样的东西(甚至更好 w/o 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));
}
await
只能在 async
函数内调用 - 参见 the MDN documentation
- 您的函数需要
async function localAuthenticate(User, email, password, hostname, done)
。
try/catch
是在使用 await
时捕获异常的方法,而不是您在直接处理 Promises 时习惯的 .then/.catch
。
当使用 async/await
:
时,您的函数将近似
async function localAuthenticate(User, email, password, hostname, done) {
try {
// Find user
let user = await User.findOne({ email: email.toLowerCase() }).exec()
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.' });
}
return done(null, user);
})
} catch (err) {
done(err)
}
}
延伸阅读:
我开始使用 async/await。通常,await 与中间件 done/next 函数一起使用的模式是什么?
例如,我如何将下面代码中的.then()替换为await? localAuthenticate
是 done/next 中间件。我需要制作一个单独的 async
函数才能在其中使用 await
吗?
我想要这样的东西(甚至更好 w/o 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));
}
await
只能在 async
函数内调用 - 参见 the MDN documentation
- 您的函数需要
async function localAuthenticate(User, email, password, hostname, done)
。 try/catch
是在使用await
时捕获异常的方法,而不是您在直接处理 Promises 时习惯的.then/.catch
。
当使用 async/await
:
async function localAuthenticate(User, email, password, hostname, done) {
try {
// Find user
let user = await User.findOne({ email: email.toLowerCase() }).exec()
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.' });
}
return done(null, user);
})
} catch (err) {
done(err)
}
}
延伸阅读: