在Express中重新发送后处理异步调用有什么问题

时间:2019-07-17 12:30:54

标签: express asynchronous

有人告诉我,执行在处理Express请求期间触发但在res.send之前未完成的任何操作都是不正确的。例如,发送推送通知或将项目保存在DB中,而无需等待其完成。如果此说法正确,在这种情况下会发生什么?

示例代码(假设我们不需要任何验证或此处的任何其他操作,并且也不必担心异步操作的结果,只是为了证明我的意思)

router.get('/push', async (req, res) {
  const data = req.body;

  // Three lines below are async actions     
  db.save(req.body);                                    // Do not await here
  push.send(req.body.device, 1);                        // Do not await here
  remoteLogger.info('received push request', req.body); // Do not await here

  res.status(200).send('ok');
})

1 个答案:

答案 0 :(得分:0)

因为保存操作(或任何其他操作)由于某种原因而可能失败,并且您可能希望在这种情况下客户端出现错误。 如果您在保存操作完成之前将响应发送给客户端,则由于已经发送了响应并且连接已关闭,您将无法告诉客户端。