在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$
关闭是否意味着其他内容?
答案 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”监听器将在不久后执行回调功能。
如果您需要代码段:
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');
});
当然,只有在服务请求是您进程的唯一活动时才起作用,但我认为大多数服务器都是这种情况。