【发布时间】:2017-03-22 08:00:40
【问题描述】:
在 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.685 毫秒内完成,但响应需要 2500 毫秒才能完成。)
有没有办法在不让客户端等待/挂起的情况下立即发送响应并完成其他任务? (在我的例子中,客户端不能进行多个 API 调用。)
【问题讨论】:
-
你所拥有的应该可以正常工作吗?只要响应在服务器上结束,之后发生的事情不应该影响浏览器。
-
@adeneo 我已经在本地使用 CURL 进行了测试,响应在
200- 15000ms之间。当我注释掉performComplexTasks(body)时,响应大约是10ms。所有其他 API 端点(没有长任务)似乎更快。这可能是因为一个独立的问题(即我的服务器 CPU 使用率而不是正确处理req、res)?如果是这样,您对我应该从哪里开始调查有什么建议吗? -
@adeneo 另外,如果重要的话,这个端点将被另一个服务器(不是浏览器)调用。
-
尝试
res.status(200).send('Success')并删除res.end,然后尝试在超时或nextTick 中包装performComplexTasks()?我不知道这是否会有所作为,但这是我要开始的。
标签: javascript node.js express asynchronous