Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js:知道所有http请求何时完成_Javascript_Node.js_Http_Events_Request - Fatal编程技术网

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

Javascript Node.js:知道所有http请求何时完成,javascript,node.js,http,events,request,Javascript,Node.js,Http,Events,Request,您好,我正在使用Node.js集群模块运行我的应用程序,我正在尝试找到一种在不丢失任何请求的情况下优雅地退出工作程序的方法 因此,我使用server.close()停止接受新请求,但如何知道正在处理的实际请求是否已完成 我想出了一个好办法: var http = require('http'); var server = http.createServer(function(res, req) { setTimeout(function() { // simulate a request

您好,我正在使用Node.js集群模块运行我的应用程序,我正在尝试找到一种在不丢失任何请求的情况下优雅地退出工作程序的方法

因此,我使用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()
服务器。这会告诉节点,一旦不再使用此服务器对象,并且没有其他类似的资源在使用中,进程就可以退出

有关更多详细信息,请参阅

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


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

如果您可以为请求使用Ajax调用,则可以使用$(document).ajaxStart和$(document).ajaxStop检查流程请求是否完成