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 meuEvento for emitido.
  • emit('meuEvento', arg1, arg2, ...) dispara o evento e passa os argumentos para os listeners.
  • Os parâmetros passados em emit sã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);