在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调用。)
答案 0 :(得分:2)
我是否正确地试图在performComplexTasks
执行CPU密集型工作?如果是这样,则该任务将锁定事件循环,并且新请求将一直等到作业完成。
在node.js中执行这样的复杂'是一种不好的做法。与http服务器在同一进程中的任务。考虑使用后台工作人员,队列或类似的东西。
有关详细信息,请参阅此主题:Node.js and CPU intensive requests
答案 1 :(得分:2)
如果你的工作不是超级CPU,并且你可以容忍主服务器线程上的一些工作,那么只需使用等待来中断执行,以便正确发送请求。您可以使用setTimeout
或await
。
// 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");
}
这不是一个非常棒的解决方案,您需要使用工作线程进行长时间的操作。