Como escutar e tratar eventos com o módulo process do Node.js

Clara Tersi
gruponewway
Published in
3 min readNov 7, 2019

O objeto process é uma variável global que possibilita controlar e ter informações sobre o processo em execução do Node.js.

Photo by Safar Safarov on Unsplash

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.

Escutando o evento 'exit'

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.

Escutando o evento 'warning'

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:

Escutando a uma uncaughtException

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.

Lidando 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.

Escutando um SIGINT

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.

Tratando um evento SIGTERM

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.

--

--