9

在 Node 文档中,http 服务器似乎有一个关闭事件

事件:'关闭'

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$ 

close在这里还有别的意思吗?

4

4 回答 4

27

杀死服务器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);
  });
});
于 2013-09-09T07:07:58.623 回答
4

您为close. 用于server.close();触发服务器事件。

于 2013-09-09T08:03:57.067 回答
1

下面是快照,请注意我最后 2 秒后关闭服务器,因此事件“关闭”侦听器将在不久后执行回调函数。 在此处输入图像描述

如果你想要代码片段:

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);

希望这有帮助:)

于 2018-10-20T07:03:55.237 回答
1

尽管文档中声称,服务器似乎没有触发任何类型的close//事件。我找到的解决方法是监听节点进程的终止。finishterminate

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');
});

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

于 2020-03-31T14:55:08.063 回答