Event Bus e o padrão Observer em JavaScript (Node.js) — criação de sistemas de eventos flexíveis

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Event Bus e o padrão Observer em JavaScript (Node.js)

No desenvolvimento moderno com Node.js, surge frequentemente a necessidade de organizar a interação entre diferentes componentes da aplicação sem criar vínculos rígidos entre eles. O padrão Observer (Observador) e sua implementação mais poderosa — Event Bus (Barramento de Eventos) — fornecem uma solução elegante para esse problema. Neste artigo, vamos detalhar como implementar esses padrões em JavaScript puro no ambiente Node.js, analisar suas vantagens e cenários típicos de uso.



O que é o padrão Observer?

O padrão Observer define uma relação "um para muitos" entre objetos: quando um objeto (sujeito) altera seu estado, todos os objetos dependentes dele (observadores) são automaticamente notificados. No contexto do Node.js, esse padrão está na base do módulo nativo events, que fornece a classe EventEmitter.



Event Bus: expansão do conceito

Event Bus é um barramento de eventos centralizado que permite que qualquer componente da aplicação envie e receba mensagens sem se conhecerem diretamente. Isso é especialmente útil em arquiteturas de microsserviços, aplicações complexas com estrutura modular ou na criação de sistemas de plugins.



Implementação de Event Bus em Node.js

Vamos criar nosso próprio Event Bus do zero. Nossa classe suportará os métodos principais: inscrição em eventos (on), inscrição única (once), remoção de inscritos (off) e emissão de eventos (emit).



class EventBus {    constructor() {        this.events = {};    }

on(event, listener) { if (!this.events[event]) { this.events[event] = []; } this.events[event].push(listener); return () => this.off(event, listener); }

once(event, listener) { const wrapper = (...args) => { listener(...args); this.off(event, wrapper); }; this.on(event, wrapper); return () => this.off(event, wrapper); }

off(event, listener) { if (!this.events[event]) return; this.events[event] = this.events[event].filter(l => l !== listener); }

emit(event, ...args) { if (!this.events[event]) return false; this.events[event].forEach(listener => listener(...args)); return true; }}

// Exemplo de usoconst bus = new EventBus();

const unsubscribe = bus.on('user:login', (username) => { console.log(`Usuário ${username} entrou no sistema`);});

bus.once('app:start', () => { console.log('Aplicação iniciada (notificação única)');});

// Emissão de eventosbus.emit('app:start'); // "Aplicação iniciada (notificação única)"bus.emit('user:login', 'Ana'); // "Usuário Ana entrou no sistema"

// Cancelamento de inscriçãounsubscribe();bus.emit('user:login', 'João'); // Nada acontece


Uso do EventEmitter nativo do Node.js

O Node.js fornece uma implementação pronta do EventEmitter no módulo events. No entanto, um Event Bus criado com base nele permite gerenciar centralmente todos os eventos da aplicação.



const EventEmitter = require('events');

class AppEventBus extends EventEmitter { constructor() { super(); this.setMaxListeners(50); // Aumenta o limite de inscritos }

// Adiciona logging para depuração emit(event, ...args) { console.log(`[EventBus] Evento: ${event}`); return super.emit(event, ...args); }}

const appBus = new AppEventBus();

// Inscrição em eventosappBus.on('order:created', (order) => { console.log(`Pedido #${order.id} criado. Enviando notificação.`);});

appBus.on('order:created', (order) => { console.log(`Pedido #${order.id} criado. Atualizando estoque.`);});

// EmissãoappBus.emit('o

Recommendations