在我的进程终止之前,我一直在尝试执行异步操作。
说“终止”是指终止的所有可能性:
ctrl+c
据我所知,exit
事件会对此进行同步操作。
阅读Nodejs文档我发现beforeExit
事件是针对异步操作但是:
对于导致显式终止的条件,不会发出'beforeExit'事件,例如调用
process.exit()
或未捕获的异常。除非打算安排额外工作,否则不应将'beforeExit'用作'exit'事件的替代方案。
有什么建议吗?
答案 0 :(得分:10)
您可以在退出之前捕获信号并执行异步任务。这样的东西会在退出之前调用terminator()函数(甚至代码中的javascript错误):
process.on('exit', function () {
// Do some cleanup such as close db
if (db) {
db.close();
}
});
// catching signals and do something before exit
['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
].forEach(function (sig) {
process.on(sig, function () {
terminator(sig);
console.log('signal: ' + sig);
});
});
function terminator(sig) {
if (typeof sig === "string") {
// call your async task here and then call process.exit() after async task is done
myAsyncTaskBeforeExit(function() {
console.log('Received %s - terminating server app ...', sig);
process.exit(1);
});
}
console.log('Node server stopped.');
}
添加评论中要求的详细信息:
答案 1 :(得分:3)
这是我的看法。在此处将其发布为一段代码很长,因此请共享Github要点。
https://gist.github.com/nfantone/1eaa803772025df69d07f4dbf5df7e58
这很简单。您可以这样使用它:
'use strict';
const beforeShutdown = require('./before-shutdown');
// Register shutdown callbacks: they will be executed in the order they were provided
beforeShutdown(() => db.close());
beforeShutdown(() => server.close());
beforeShutdown(/* Do any async cleanup */);
以上内容将监听一组特定的系统信号(默认情况下为SIGINT
,又名 Ctrl + C 和SIGTERM
),并且在关闭整个过程之前,依次调用每个处理程序。
也是
async
回调(或返回Promise
)。答案 2 :(得分:1)
结合答案+处理未捕获的异常和承诺拒绝
async function exitHandler(evtOrExitCodeOrError: number | string | Error) {
try {
// await async code here
// Optionally: Handle evtOrExitCodeOrError here
} catch (e) {
console.error('EXIT HANDLER ERROR', e);
}
process.exit(isNaN(+evtOrExitCodeOrError) ? 1 : +evtOrExitCodeOrError);
}
[
'beforeExit', 'uncaughtException', 'unhandledRejection',
'SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP',
'SIGABRT','SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV',
'SIGUSR2', 'SIGTERM',
].forEach(evt => process.on(evt, exitHandler));
答案 3 :(得分:0)
使用beforeExit挂钩
当Node.js清空其事件循环并且没有其他工作要安排时,将发出“ beforeExit”事件。通常,没有安排任何工作时,Node.js进程将退出,但是在“ beforeExit”事件上注册的侦听器可以进行异步调用,从而导致Node.js进程继续。
process.on('beforeExit', async ()=> {
await something()
process.exit(0) // if you don't close yourself this will run forever
}