EventEmitter
EventEmitter lets objects emit named events that listeners react to.
Syntax
emitter.on('event', listener);
emitter.emit('event', data);Much of Node is built on events. The events module provides the EventEmitter class, which lets an object emit named events and lets other code listen for them.
Core methods
on(name, listener)— register a listener.emit(name, ...args)— fire an event.once(name, listener)— listen only for the first occurrence.
This is the observer pattern: emitters and listeners stay decoupled.
Example
const EventEmitter = require('events');
const bus = new EventEmitter();
bus.on('order', (item) => {
console.log('New order:', item);
});
bus.emit('order', 'Pizza');
bus.emit('order', 'Salad');When to use it
- An HTTP server emits a `'request'` event for every incoming connection, and listeners attached with `.on()` handle routing without tight coupling.
- A file-watcher module emits `'change'`, `'add'`, and `'unlink'` events so multiple parts of a build tool can react independently.
- A game engine uses a custom EventEmitter to broadcast `'player:join'` and `'player:leave'` events that the scoreboard and chat systems listen for separately.
More examples
Basic EventEmitter usage
Creates a basic emitter, attaches a listener with `.on()`, and fires the event with `.emit()`.
const { EventEmitter } = require('events');
const emitter = new EventEmitter();
emitter.on('greet', (name) => {
console.log(`Hello, ${name}!`);
});
emitter.emit('greet', 'Alice'); // Hello, Alice!Once listener and remove
Uses `.once()` to register a one-time listener that is automatically removed after the first emit.
const { EventEmitter } = require('events');
const ee = new EventEmitter();
ee.once('connected', () => console.log('Connected!')); // fires once
ee.emit('connected'); // prints
ee.emit('connected'); // silent -- listener removedExtend EventEmitter in a class
Extends `EventEmitter` in a class to give custom objects the ability to emit and receive typed events.
const { EventEmitter } = require('events');
class Database extends EventEmitter {
connect(url) {
// simulate async connection
setTimeout(() => this.emit('ready', url), 100);
}
}
const db = new Database();
db.on('ready', url => console.log('DB connected to', url));
db.connect('mongodb://localhost/mydb');
Discussion