Node.js ยท Chapter 11 of 43

Events & EventEmitter

Node.js is built around an event-driven architecture. Many built-in objects, like HTTP servers and streams, emit named events that you can listen for.

The `events` module provides the `EventEmitter` class, which you can also use to build your own event-based objects.

Emitting and listening

Use `.on()` to register a listener for an event and `.emit()` to trigger it, optionally passing data.

Custom emitters

You can extend EventEmitter to create objects that broadcast their own custom events, a common pattern for decoupled code.

Example 1 (javascript)
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('greet', name => console.log('Hello, ' + name));
emitter.emit('greet', 'Ada');
Output
Hello, Ada

The listener registered with .on() runs when .emit() fires the event.

Example 2 (javascript)
class Logger extends require('events') {
  log(msg) { this.emit('logged', msg); }
}
const logger = new Logger();
logger.on('logged', msg => console.log('LOG:', msg));
logger.log('Server started');
Output
LOG: Server started

A custom class extends EventEmitter to broadcast its own events.

Key points

  • Node.js relies heavily on an event-driven model.
  • EventEmitter provides .on() and .emit() methods.
  • Many core modules (http, streams) are EventEmitters.
  • You can extend EventEmitter for custom event-based objects.
๐Ÿ’ก Note: Always remember to attach an 'error' listener on EventEmitters, or unhandled errors will crash your app.

๐Ÿ“ Quick Quiz

1. Which method registers an event listener?

2. Which method triggers an event?

3. Which module provides EventEmitter?