Node.js:知道所有http请求何时完成

您好,我正在使用Node.js集群模块运行我的应用程序,并试图找到一种优雅地退出工作程序而不丢失任何请求的方式。Node.js:知道所有http请求何时完成

因此,我使用server.close()停止接受新请求,但如何知道正在处理的实际请求是否已完成?

我想出了这个技巧的正常工作:

var http = require('http'); 

var server = http.createServer(function(res, req) {

setTimeout(function() { // simulate a request which takes time (1sec) to finish

req.end('hallo');

}, 1000);

}).listen(8080);

server._requests = 0;

server.on('request', function(req, res) {

server._requests += 1;

res.once('finish', function() {

server._requests -= 1;

if (server._requests === 0)

server.emit('no_more_requests');

});

});

function gracefulExit() {

server.close();

if (server._requests === 0) process.exit(0); // exit right away

server.once('no_more_requests', process.exit); // or wait

}

process.on('SIGTERM', gracefulExit);

process.on('SIGINT', gracefulExit);

但有这样做的更优雅的方式?

回答:

您不必手动关闭服务器。相反,你可以unref()服务器。这告诉节点,只要这个服务器对象不再被使用,并且没有其他类似的资源在使用,那么该进程就可以退出。

查看nodejsserver.unref() doc了解更多详情。

请注意,您不能立即执行此操作,因为您的服务器将启动并且在处理任何请求之前该进程将退出。相反,在服务器运行后,您需要在将来某个时间决定,然后您想要server.unref()并让它关闭。

请注意,node.js中的计时器具有相同的功能,因此您可以决定计时器是否应使处理继续运行。

以上是 Node.js:知道所有http请求何时完成 的全部内容, 来源链接: utcz.com/qa/259401.html

回到顶部