Después de jugar con otra respuesta, aquí está mi solución para esta tarea. La implementación de esta manera me ayuda a centralizar la limpieza en un solo lugar, evitando el doble manejo de la limpieza.
- Me gustaría enrutar todos los demás códigos de salida al código de 'salida'.
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- Lo que hace el exitRouter es llamar a process.exit ()
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- En 'salir', maneje la limpieza con una nueva función
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Para el propósito de demostración, este es un enlace a mi esencia. En el archivo, agrego un setTimeout para falsificar el proceso en ejecución.
Si corre node node-exit-demo.js
y no hace nada, luego de 2 segundos, verá el registro:
The service is finish after a while.
ExitCode 0
Exiting finally...
De lo contrario, si antes de que finalice el servicio, termina ctrl+C
, verá:
^CExitCode SIGINT
ExitCode 0
Exiting finally...
Lo que sucedió es que el proceso Node salió inicialmente con el código SIGINT, luego se enruta a process.exit () y finalmente salió con el código de salida 0.