Погравши з іншою відповіддю, ось моє рішення цього завдання. Реалізація цього способу допомагає мені централізувати очищення в одному місці, запобігаючи подвійному поводженню з очищенням.
- Я хотів би спрямувати всі інші вихідні коди до коду "вихід".
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- Що робить exitRouter, це викликати process.exit ()
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- Під час виходу виконайте очищення за допомогою нової функції
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Для демонстраційних цілей це посилання на мою суть. У файл я додаю setTimeout, щоб підробити процес.
Якщо ви біжите node node-exit-demo.jsі нічого не робите, то через 2 секунди ви побачите журнал:
The service is finish after a while.
ExitCode 0
Exiting finally...
Ще, якщо до завершення послуги ви припините ctrl+C, ви побачите:
^CExitCode SIGINT
ExitCode 0
Exiting finally...
Що трапилося, процес Node, який вийшов із початкового коду SIGINT, потім направляє на process.exit () і, нарешті, виходив з кодом виходу 0.