我有一条明确的路线,说:
app.use('/route', middleware, handler);
function middleware(req, res, next) {
// do some async task
if( success ) {
// async task is successfully done. handler should be called
next();
} else {
// error in async task, handler should not be called
res.json({ message: 'fail'});
}
}
handler(req, res, next) {
res.json({ message: 'done'});
}
我想异步执行某项任务,如果该任务成功完成,那么只应调用后续的中间件。
问题出在异步任务完成之前,调用handler
(按预期方式)并且响应结束。
因此,当异步任务完成并尝试在res.json()
中调用middleware
时,它会给我'Can't set headers after they are sent'
(已发布)
那么如何在middleware
进行异步任务时进行快速等待,一旦完成,只有后续处理程序才会被调用。
我看过(here)
但帮助不大。
我尝试过使用req.pause()
,但这似乎不起作用。
答案 0 :(得分:1)
您可以在中间件上使用async
并等待执行时使用await
完成异步执行。你的代码应该看起来像。
请务必从promise
DoYourTask()
async function middleware(req, res, next) {
var success = await DoYouTask();
if( success ) {
// async task is successfully done. handler should be called
next();
} else {
// error in async task, handler should not be called
res.json({ message: 'fail'});
}
}