De acuerdo con la documentación de Node.js , por lo general, no es una buena idea usar process.exit() porque las operaciones de E/S asíncronas como console.log() u otros métodos de registro (biblioteca de registro de Pino en mi caso) pueden omitirse, el proceso finaliza antes ellos completan su tarea. Me preguntaba cuál es la mejor manera de manejar los errores dentro de una función. Mi objetivo final es manejar los errores en una función y, si el error es fatal, salir del proceso.
Escribí una versión simplificada de lo que actualmente creo que es la mejor opción (similar a la solución explicada en los documentos de Node.js):
const validateUserInput = (input) => { try { if (input === 'wrong') { throw new Error('sample error'); } // simplified } catch (err) { console.log('last message'); // process.exit(1) --> using this might skip IO operation like the log on previous line process.exitCode = 1; return false; } return true; }; if (validateUserInput('wrong')) { // rest of the code } // nothing should be written hereSIGTERM es la señal que le dice a un proceso que termine correctamente. Es la señal que envían los administradores de procesos como upstart o supervisord y muchos otros.
Puedes enviar esta señal desde dentro del programa, en otra función: leer más
process.kill(process.pid, 'SIGTERM')También puede configurar sus propios oyentes para este evento y realizar otras tareas.
process.on('SIGTERM', () => { server.close(() => { console.log('Shutting down the application ...') }) }) Pero SIGTERM no es compatible con Windows, por lo que puede usar SIGINT en su lugar, aquí hay información útil sobre SIGINT
Después de recibir la señal SIGINT, el servidor Node.js inicia una secuencia de apagado y entra en el modo de apagado. Todas las solicitudes existentes se completan y no se aceptan nuevas solicitudes. Cuando se completa la última solicitud, el servidor cierra todas las conexiones y se apaga. Lee mas
Más sobre procesos aquí
Si se produce un error fatal, la aplicación deberá cerrarse correctamente para evitar que se produzca el comportamiento predeterminado y permitir que se ejecuten sentencias adicionales primero. Puede lograr esto creando un detector de eventos simple:
// For app termination const gracefulShutdown = (msg, callback) => { server.close(() => { //execute additional code here console.log(`Application disconnected through ${msg}`); callback(); }) } process.on('SIGINT', () => { //execute additional code here gracefulShutdown('app termination', () => { process.exitCode = 1; }) })