发送响应并继续执行任务Express | Node.js的

时间:2016-11-08 15:54:40

标签: javascript node.js express asynchronous

在Node.js(我刚接触过)中,我试图在收到回复后执行一系列任务。但是,我想尽快做出响应时间。我不需要将这些任务的结果返回给客户,所以我试图立即返回响应。

我目前的实施大致是:

var requestTime = Date.now; 

app.post('/messages', function (req, res) {
  console.log("received request");

  // handle the response
  var body = res.body;
  res.send('Success');
  res.end();
  console.log("sent response");

  performComplexTasks(body)
})

function performComplexTasks(body){
   // perform data with body data here;
   console.log("finished tasks:", Date.now()-requestTime, "ms");
}

// -------LOG-----------
//    received request
//    POST /api/messages 200 3.685 ms - 59
//    sent response
//    finished tasks: 2500ms

发出请求的客户端似乎一直挂起,直到performComplexTasks()完成。 (POST在3.685ms完成,但响应需要2500ms才能完成。)

有没有办法立即发送响应并完成其他任务而无需客户端等待/挂起? (就我而言,客户端无法进行多次API调用。)

2 个答案:

答案 0 :(得分:2)

我是否正确地试图在performComplexTasks执行CPU密集型工作?如果是这样,则该任务将锁定事件循环,并且新请求将一直等到作业完成。

在node.js中执行这样的复杂'是一种不好的做法。与http服务器在同一进程中的任务。考虑使用后台工作人员,队列或类似的东西。

有关详细信息,请参阅此主题:Node.js and CPU intensive requests

答案 1 :(得分:2)

如果你的工作不是超级CPU,并且你可以容忍主服务器线程上的一些工作,那么只需使用等待来中断执行,以便正确发送请求。您可以使用setTimeoutawait

// This line is wrong too - ask a separate question if needed
var requestTime = Date.now; 

app.post('/messages', async function (req, res) {
  console.log("received request");

  // handle the response
  var body = res.body;
  res.status(200).send({ success: true });
  console.log("sent response");

  // Method 1:
  await performComplexTasks(body)

  // Method 2:
  setTimeout(() => performComplexTasks(body), 0);
})

async function performComplexTasks(body){
   // The line below is required if using the `await` method -
   // it breaks execution and allows your previous function to
   // continue, otherwise we will only resume the other function after
   // this function is completed.
   await new Promise(resolve => setTimeout(resolve, 1));

   // perform data with body data here;
   console.log("finished tasks:", Date.now()-requestTime, "ms");
}

这不是一个非常棒的解决方案,您需要使用工作线程进行长时间的操作。