Node.js:了解所有HTTP请求何时完成

4
你好,我正在使用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);

但是有没有更优雅的方法呢?


如果您可以使用Ajax调用请求,您可以使用$(document).ajaxStart和$(document).ajaxStop来检查进程请求是否已完成。 - Nithin Paul
1个回答

2
您不必手动关闭服务器。相反,您可以使用unref()方法取消引用服务器。这告诉node.js,一旦此服务器对象不再使用且没有其他类似资源在使用,进程就可以退出。
有关更多详细信息,请参见node.js server.unref()文档
请注意,您不能立即执行此操作,因为这样会导致服务器启动并在处理任何请求之前进程退出。相反,您需要在服务器运行一段时间后决定是否要server.unref()并让其关闭。
请注意,node.js中的定时器也具有相同的功能,因此您可以决定定时器是否应保持处理正在进行或停止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接