Como escutar e tratar eventos com o módulo process do Node.js
O objeto process
é uma variável global que possibilita controlar e ter informações sobre o processo em execução do Node.js.
Saber trabalhar com este módulo é importante para conseguir:
- Ter um melhor conhecimento sobre os estados do processo das nossas aplicações;
- Tratar melhor os erros lançados;
- Conseguir criar um desligamento adequado caso a execução precise ser encerrada.
Como o process
é uma instância de EventEmitter
, conseguimos escutar seus eventos chamando .on
. Este artigo lista os eventos de maior destaque, e a lista completa pode ser encontrada na documentação oficial do Node.js.
exit
Esse evento é emitido quando um processo está prestes a ser encerrado internamente: devido a uma chamada ao método process.exit()
ou ao loop de eventos do Node.js não ter mais nada a executar.
O processo será encerrado assim que todos os listeners do evento exit
terminarem de executar, e nesse ponto não existe nenhuma ação que possa ser feita para impedir que o processo termine.
Dentro do listener de um evento exit
devemos apenas executar código síncrono, pois o processo será encerrado imediatamente. Qualquer processamento que ainda estiver enfileirado para ser executado pelo loop de eventos será abandonado.
warning
Um warning
é emitido quando o Node.js encontra códigos escritos utilizando práticas ruim, que podem levar a má performance da aplicação, bugs, ou vulnerabilidades.
uncaughtException
É emitido quando uma exceção não tratada chega até o event loop. O tratamento padrão do Node.js para essas exceções é exibir o stack do erro e finalizar o processo com código 1. Para escutar a esse evento:
Cuidado ao sobrescrever o comportamento padrão deste evento. Uma exceção não tratada significa que a aplicação está em um estado não definido ou conhecido. Fazer com que ela continue a executar pode causar problemas não previstos. Na documentação do Node.js existe um analogia bem interessante sobre isso:
Tentar continuar a execução normalmente após uma exceção não tratada é similar a desligar seu computador durante uma atualização puxando o plugue da tomada — 9 em cada 10 vezes não vai acontecer nada — mas na décima vez, o sistema será corrompido.
Então atenção com este evento:
- Este evento deve ser usado para fazer uma limpeza síncrona dos recursos alocados antes de finalizar o processo.
- Qualquer exceção que for lançada dentro da função handler desse evento não será tratada, o processo será encerrado com algum código de erro, e o stack será exibido.
- Devemos monitorar nossa aplicação com ferramentas externas para pegar esse tipo de erro, e reiniciar o processo quando necessário.
unhandledRejection
Emitido quando uma Promise é rejeitada mas nenhum tratamento de erro foi realizado para essa rejeição ( promise.catch()
).
Monitorar esse evento nos ajuda a enxergar as promises com rejeições não tratadas.
SIGINT
É um evento de sinal que o Node.js emite quando recebe esse sinal.
No caso desse evento, é emitido quando tentamos finalizar o processo da aplicação Node.js apertando Ctrl+C no terminal.
Lidar com esse evento nos permite também fazer uma limpeza dos recursos utilizados antes de encerrar o processo.
SIGTERM
Outro evento de sinal importante para que seja feito um desligamento adequado (graceful shutdown) das nossas aplicações é o SIGTERM. Ele indica que foi enviado algum sinal ao processo solicitando seu encerramento.
Também é importante escutarmos esse evento, implementando uma função que lide com a limpeza de todos os recursos pendentes.
Conhecer sobre esses eventos leva a um melhor entendimento de como nossa aplicação está funcionando, e para que seja finalizada de maneira mais limpa quando seu processo for encerrado.