The Node.js EventEmitter: A Core Concept for Asynchronous Events

Node.js Logo

The `EventEmitter` class is at the heart of Node.js's asynchronous, event-driven architecture. Many of Node's built-in modules, like HTTP servers and streams, inherit from `EventEmitter`. It allows you to create, listen for, and emit custom events.

Core Methods

  • `.on(eventName, listener)`: Registers a listener function for a specific event.
  • `.emit(eventName, [args...])`: Triggers an event, calling all registered listeners for it.
  • `.once(eventName, listener)`: Registers a listener that will be called only once for an event.

Creating a Custom Emitter

Let's create a simple logger that emits events for different log levels.

const EventEmitter = require('events');

class Logger extends EventEmitter {
  log(level, message) {
    const timestamp = new Date().toISOString();
    this.emit('message', { level, message, timestamp });
  }
}

const logger = new Logger();

// Register a listener
logger.on('message', (data) => {
  console.log(`[${data.level.toUpperCase()}] ${data.timestamp}: ${data.message}`);
});

// Trigger events
logger.log('info', 'User logged in.');
logger.log('error', 'Database connection failed.');

The EventEmitter pattern is a powerful way to decouple different parts of your application. Instead of one component calling another directly, it can simply emit an event, and any interested components can listen for it.

Comments