确保在Express中同步执行异步中间件

时间:2018-04-18 15:09:48

标签: javascript node.js express

我有一条明确的路线,说:

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(),但这似乎不起作用。

1 个答案:

答案 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'});
 }
}