Node.js服务器'close'事件似乎没有触发

时间:2013-09-09 06:25:25

标签: node.js

在Node文档中,http servers appear to have a close event

  

事件:'关闭'

     

function () { }

     

服务器关闭时发出。

但我无法弄清楚如何触发它:

// server.js

var http = require('http');
var server = http.createServer();
server.on('close', function() {
  console.log(' Stopping ...');
});
server.listen(8000);

我期待消息“停止......”

$ node server.js
^C Stopping ...
$ 

但是没有什么

$ node server.js
^C$ 

关闭是否意味着其他内容?

4 个答案:

答案 0 :(得分:15)

使用Ctrl+C杀死服务器不允许服务器自行关闭;你必须自己做。像这样的东西应该成功(在类UNIX系统上):

var http = require('http');
var server = http.createServer();
server.on('close', function() {
  console.log(' Stopping ...');
});

process.on('SIGINT', function() {
  server.close();
});

server.listen(8000);

一旦HTTP服务器关闭并且Node意识到没有可以挂起的异步操作,它将自动停止该过程。如果事件循环中有其他内容(计时器等),并且您希望在服务器关闭后强制事件循环停止,close将进行回调:

process.on('SIGINT', function() {
  server.close(function() {
    process.exit(0);
  });
});

答案 1 :(得分:3)

您为close添加了一个事件处理程序。使用server.close();来触发服务器事件。

答案 2 :(得分:0)

下面是快照,请注意,我最后要在2秒后关闭服务器,因此事件“ close”监听器将在不久后执行回调功能。 enter image description here

如果您需要代码段:

const http = require('http');
const server = http.createServer();

// When Server starts listening
server.on('listening',()=>{
  console.log('Captured listening event');
});

// When User tries to connect to server
server.on('connection', ()=>{
  console.log('Connection Established');
});

// When the server is closed
server.on('close', ()=>{
  console.log('Connection terminated');
});


// 'listening' Event Fired
server.listen(3000);


// Close Server to get 'close' event fired
setTimeout(function(){
  server.close();
},2000);

希望这有帮助:)

答案 3 :(得分:0)

尽管文档中声明了什么,但服务器似乎未触发任何类型的close / finish / terminate事件。 我发现的解决方法是监听节点进程的终止。

let wasCleanedUp = false;

const runBeforeExiting = (fun: Function) => {
  const exitSignals = ['exit', 'SIGINT', 'SIGUSR1', 'SIGUSR2', 'uncaughtException'];
  for (const signal of exitSignals) {
    process.on(signal as any, async () => { // eslint-disable-line @typescript-eslint/no-explicit-any
      if (!wasCleanedUp) {
        await fun();
        wasCleanedUp = true;
      }
      process.exit();
    });
  }
};

// And then before starting your server...
runBeforeExiting(() => {
  console.log('clean my application, close the DB connection, etc');
});

当然,只有在服务请求是您进程的唯一活动时才起作用,但我认为大多数服务器都是这种情况。