プロセスが終了する前に非同期操作を実行しようとしています。
「終了」とは、終了の可能性をすべて意味します。
ctrl+c
_私の知る限りでは、exit
イベントは同期操作のためにそれを行います。
Nodejsのドキュメントを読んで、 beforeExit
イベントが非同期操作用であることがわかりましたBUT:
「beforeExit」イベントは、
process.exit()
の呼び出しやキャッチされない例外など、明示的な終了を引き起こす条件に対しては発行されません。「beforeExit」は、追加の作業をスケジュールする意図がない限り、「exit」イベントの代わりとして使用しないでください。
助言がありますか?
終了する前に、シグナルをトラップして非同期タスクを実行できます。このようなものは、終了する前に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.');
}
コメントでリクエストされた詳細を追加:
BeforeExitフックの使用
「beforeExit」イベントは、Node.jsがイベントループを空にして、スケジュールする追加の作業がない場合に発生します。通常、スケジュールされた作業がない場合、Node.jsプロセスは終了しますが、「beforeExit」イベントに登録されたリスナーは非同期呼び出しを行うことができるため、Node.jsプロセスが続行されます。
process.on('beforeExit', async () => {
await something()
process.exit(0) // if you don't close yourself this will run forever
});