Eventos
O node.js é perfeito para desenvolver aplicações orientadas a eventos.
Muitos objetos em node.js emitem eventos, por exemplo, net.Server emite um evento toda vez que um ponto se conecta a ele, o objeto fs.readStream emite um evento quando um ficheiro é aberto. Todos os objetos que emitem eventos são instâncias de events.EventEmitter.
Exemplo:
const fs = require('fs'); 
var readStream = fs.createReadStream('./file.txt'); 
readStream.on('open', function () { 
   console.log('O ficheiro está aberto'); 
}); 
readStream.on('error', function () { 
   console.log('O ficheiro não existe'); 
}); Neste exemplo, usamos o método createReadStream() do objeto fs para abrir um ficheiro.
Este método emite dois eventos : open e error se abrir o ficheiro ou se este não existir, respetivamente.
Tratamos os dois eventos com o método on que recebe dois argumentos: uma string que identifica o evento e uma função de callback que é executada pelo node.js quando o evento ocorrer.
O módulo events
Podemos criar os nossos próprios eventos usando o módulo events. Para isso fazemos:
let events = require('events');O módulo events possui uma classe, EventEmitter, a partir da qual podemos criar um objeto que possui um conjunto de métodos e propriedades que nos permitem, por exemplo, capturar eventos e/ou emitir eventos.
Para podermos tratar os nossos próprios eventos, começamos por instanciar um objeto da classe EventEmitter:
var events = require('events');
var eventEmitter = new events.EventEmitter();Depois, podemos usar os métodos on e emit para capturar um evento ou emitir um evento, respetivamente:
var events = require('events'); 
var eventEmitter = new events.EventEmitter(); 
//Captura o evento ‘grito’ e trata o evento: 
eventEmitter.on('grito', function(){ 
   console.log("Ouvi um grito"); 
}); 
//Dispara o evento ‘grito’: 
eventEmitter.emit('grito'); Emitir evento com argumentos
Passo 1: Importar o módulo events e criar um EventEmitter
const EventEmitter = require('events');
const meuEmitter = new EventEmitter();
Passo 2: Registrar um listener para o evento, definindo os parâmetros esperados
meuEmitter.on('meuEvento', (param1, param2) => {
  console.log(`Evento recebido com parâmetros: ${param1} e ${param2}`);
});
Passo 3: Emitir o evento passando os parâmetros
meuEmitter.emit('meuEvento', 'Olá', 2025);
Na consola, aparecerá a mensagem:
textEvento recebido com parâmetros: Olá e 2025
Explicação
- EventEmitteré uma classe do Node.js que permite criar emissores de eventos.
- on('meuEvento', callback)registra um “listener” que será chamado quando o evento- meuEventofor emitido.
- emit('meuEvento', arg1, arg2, ...)dispara o evento e passa os argumentos para os listeners.
- Os parâmetros passados em emitsão recebidos pelo callback na mesma ordem.
Esse padrão é muito usado para comunicação interna entre módulos assíncronos em Node.js, com múltiplos listeners podendo responder aos mesmos eventos, cada um recebendo os parâmetros emitidos.
Exemplo completo:
const EventEmitter = require('events');
const meuEmitter = new EventEmitter();
meuEmitter.on('meuEvento', (param1, param2) => {
  console.log(`Evento recebido com parâmetros: ${param1} e ${param2}`);
});
meuEmitter.emit('meuEvento', 'Olá', 2025);
