Express.js:发送响应并执行后台任务

Sim*_*gro 4 javascript node.js express

在 Express.js 中,我想在发送响应后执行任务。

但是,我想让响应时间尽可能快。我不需要将此任务的结果返回给客户端,因此我尝试立即返回响应。

该任务不是 CPU 密集型任务,因此事件循环不会被该任务锁定。

所以,这是我的后台任务:

function backgroundTask() {
   return new Promise(resolve => setTimeout(() => {
      console.log("backgroundTask finished");
      resolve();
   }, 1000));
}
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是直接调用backgroundTask函数:

app.post('/messages', async function (req, res) {
  res.status(200).send({ success: true });
  performBackgroundTasks();
});
Run Code Online (Sandbox Code Playgroud)

第二次尝试是将backgroundTask函数调用到setTimeout()中:

app.post('/messages', async function (req, res) {
  res.status(200).send({ success: true });
  setTimeout(() => performBackgroundTasks(), 0);
});
Run Code Online (Sandbox Code Playgroud)

问题是:确保响应发送到客户端并且任务在后台执行的最佳方法是什么?

旁注:我知道“最好的方法”是使用工作线程,但我只需要一种简单的方法来执行后台任务。

Ras*_*mon 7

您可以使用该finish事件:

app.use((req, res, next) => {
    res.on('finish', () => {
        console.log('Response has been sent!')
        performBackgroundTasks();
    })
    next()
})
Run Code Online (Sandbox Code Playgroud)

  • 可以直接在具体路由的代码中调用 res.on('finish', () => {})` (2认同)