Depois de brincar com outra resposta, aqui está a minha solução para esta tarefa. A implementação dessa maneira me ajuda a centralizar a limpeza em um só lugar, evitando o manuseio duplo da limpeza.
- Gostaria de encaminhar todos os outros códigos existentes para o código 'exit'.
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- O que o exitRouter faz é chamar process.exit ()
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- Em 'exit', lide com a limpeza com uma nova função
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Para fins de demonstração, este é um link para minha essência. No arquivo, adiciono um setTimeout para falsificar o processo em execução.
Se você executar node node-exit-demo.jse não fizer nada, depois de 2 segundos, verá o log:
The service is finish after a while.
ExitCode 0
Exiting finally...
Caso contrário, se antes do término do serviço, você terminar ctrl+C, verá:
^CExitCode SIGINT
ExitCode 0
Exiting finally...
O que aconteceu foi que o processo do Nó saiu inicialmente com o código SIGINT, em seguida, roteia para process.exit () e finalmente saiu com o código de saída 0.