Script Valley
Node.js: The Complete Runtime
Async JavaScript in Node.jsLesson 2.4

Node.js EventEmitter: building event-driven components

EventEmitter class, emit, on, once, removeListener, off, extending EventEmitter, memory leak warnings, custom events

EventEmitter Is the Core of Node.js

Node.js is built on the observer pattern. EventEmitter lets objects emit named events that any number of listener functions can subscribe to. Streams, HTTP servers, and many core APIs extend EventEmitter.

const { EventEmitter } = require('events');

const emitter = new EventEmitter();

emitter.on('data', (chunk) => {
  console.log('Received:', chunk);
});

emitter.once('end', () => {
  console.log('Fires only once');
});

emitter.emit('data', 'hello');
emitter.emit('end');

Extending EventEmitter

class FileWatcher extends EventEmitter {
  watch(path) {
    const fs = require('fs');
    fs.watch(path, (event) => {
      this.emit('change', { event, path });
    });
  }
}

const watcher = new FileWatcher();
watcher.on('change', ({ event, path }) => {
  console.log(path + ' changed: ' + event);
});
watcher.watch('./config.json');

Avoid Memory Leaks

Node.js warns when more than 10 listeners are attached to a single event โ€” a common sign of a leak. Remove listeners when done with emitter.off('event', handler) or emitter.removeAllListeners('event'). Always store the handler reference if you need to remove it later.

Up next

Handling errors in async Node.js code the right way

Sign in to track progress

Node.js EventEmitter: building event-driven components โ€” Async JavaScript in Node.js โ€” Node.js: The Complete Runtime โ€” Script Valley โ€” Script Valley