我正在尝试创建一种正常关闭我的服务器的方法,但似乎为响应 SIGINT 而调用的方法并未完全完成。
我使用 process.on('SIGINT', cb)
向 SIGINT 信号添加了一个回调函数
var stop = () => {
console.log("stopping server");
return new Promise((resolve, reject) =>
server.close(() => { console.log("server closed"); resolve(); }))
.then(() => new Promise((resolve, reject) => setTimeout(() => { console.log("time out finished"); resolve(); }, 5000)))
.then(() => process.exit(0));
}
process.on("SIGINT", stop);
我在其中添加了 setTimeout 只是为了测试服务器在完全关闭之前是否正在等待。
当我向进程发送 SIGINT 时,我得到的输出是
停止服务器
在某些情况下,停止服务器和服务器关闭日志都会出现,但并非总是如此。
我已经尝试实现上一个问题的等待功能:How to prevent Node.js from exiting while waiting for a callback? , 但我仍然取得了与上述相同的结果。
有谁知道可以让此方法在服务器退出之前完全完成的解决方法?
最佳答案
我在这方面遇到了真正的麻烦,使用 promise 和回调似乎都不起作用。 对于我自己,我认为在我的 winston 记录器将所有信息保存到文件之前进程队列清空(并且 Node 退出)。
无论如何,我最终通过为每个我想退出的进程设置手动标志来解决这个问题,以便在完成后返回 true。退出本身以 100 毫秒为间隔,并且只会在所有标志为真时退出。
例如
process.on('SIGINT', exit);
function exit(){
var myProcessFlag = myProcess.close() //returns true once complete
setInterval(function(){
if(myProcessFlag == true){
console.log('successful exit');
process.exit(0);
}
else{
console.log(`awaiting...
myProcess complete: ${myProcessFlag}`);
}
}, 100);
}
https://stackoverflow.com/questions/54170321/