我在相关主题上找到了另一篇文章(如何在退出时执行异步操作),但它可能不适用于 macOS,或者在运行 Node.js v14 时不再适用。
我原来的问题更复杂。我无法在 SIGINT 的回调(或异步回调)中获得setTimeout
s 或await
正常工作。但后来我意识到我真正需要做的,首先是能够捕捉和忽略SIGINT。
如果我能做到这一点,那么我也可以关闭以响应 SIGINT,如果我愿意的话。
所以我回到基础,看看我是否可以简单地禁用 SIGINT。我不能。
我可以检测到 SIGINT,我可以使用控制台消息或任何其他同步代码进行响应,但是无论我做什么,我的代码都会关闭,并且很快就会关闭。
process.on('SIGINT', () => { console.log('here'); return false; });
process.on('SIGINT', () => { console.log('here'); return true; });
process.on('SIGINT', () => { console.log('here'); return undefined; });
process.on('SIGINT', () => { console.log('here'); return new Promise(resolve => { console.log(resolve); }); });
这些方法都不能阻止我的 Node.js 服务器在点击Ctrl+后关闭C,或者以其他方式向进程发送 SIGINT。
更新:
当我通过 运行我的服务器时node app.js
,SIGINT 拦截正常工作!
显然,我一直被一个通过nodemon
. 无法正确捕获来自我的 IDE 终端的Ctrl+或使用 IDE 的图形红色(停止)按钮发送的中断,因为结果信号确实被发送到 nodemon。C然而,在 IDE 环境之外,没有 nodemon 解决问题,我的优雅关闭可以按我的意愿工作。