Dopo aver giocato con altre risposte, ecco la mia soluzione per questo compito. L'implementazione in questo modo mi aiuta a centralizzare la pulizia in un unico posto, evitando la doppia gestione della pulizia.
- Vorrei instradare tutti gli altri codici in uscita verso il codice "exit".
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- Quello che fa exitRouter sta chiamando process.exit ()
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- All'uscita, gestisci la pulizia con una nuova funzione
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Ai fini della demo, questo è il link al mio contenuto. Nel file, aggiungo un setTimeout per simulare il processo in esecuzione.
Se corri node node-exit-demo.jse non fai nulla, dopo 2 secondi viene visualizzato il registro:
The service is finish after a while.
ExitCode 0
Exiting finally...
Altrimenti se prima che il servizio finisca, si termina ctrl+C, vedrai:
^CExitCode SIGINT
ExitCode 0
Exiting finally...
Quello che è successo è il processo Node uscito inizialmente con il codice SIGINT, quindi instrada a process.exit () e infine è uscito con il codice di uscita 0.