Events & EventEmitter

A lot of Node's own APIs — HTTP servers, streams, file watchers — are built around one core idea: an object that emits named events, and other code that listens for them. The events module exposes that same pattern for your own code.

Creating and using an EventEmitter

JS emitter.js
const EventEmitter = require("events");

const emitter = new EventEmitter();

emitter.on("greet", (name) => {
  console.log(`Hello, ${name}!`);
});

emitter.emit("greet", "Priya");
emitter.emit("greet", "Sam");
Output
Hello, Priya!
Hello, Sam!

.on() registers a listener for a named event; .emit() fires that event, calling every listener registered for it, in the order they were added, and passing along any extra arguments.

Multiple listeners on the same event

JS multiple-listeners.js
const EventEmitter = require("events");
const emitter = new EventEmitter();

emitter.on("order", (item) => console.log(`Logging order: ${item}`));
emitter.on("order", (item) => console.log(`Sending confirmation email for: ${item}`));

emitter.emit("order", "Wireless Mouse");
Output
Logging order: Wireless Mouse
Sending confirmation email for: Wireless Mouse

This is the same shape you'll see all over Node's built-in modules — an HTTP server emits "request" for every incoming request, for instance, and http.createServer(callback) is really just a shortcut for registering that callback as a listener on "request".

Listening only once

JS once.js
const EventEmitter = require("events");
const emitter = new EventEmitter();

emitter.once("ready", () => console.log("Ready fired!"));

emitter.emit("ready");
emitter.emit("ready");
Output
Ready fired!

.once() auto-removes the listener after it fires the first time — the second emit("ready") has no listeners left to call.

Note: by default, Node warns if you register more than 10 listeners for the same event on one emitter (MaxListenersExceededWarning). It's usually a sign of a listener being re-added somewhere it shouldn't be — for example, inside a function that runs on every request — rather than a limit you should just raise.