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
const EventEmitter = require("events");
const emitter = new EventEmitter();
emitter.on("greet", (name) => {
console.log(`Hello, ${name}!`);
});
emitter.emit("greet", "Priya");
emitter.emit("greet", "Sam");
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
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");
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
const EventEmitter = require("events");
const emitter = new EventEmitter();
emitter.once("ready", () => console.log("Ready fired!"));
emitter.emit("ready");
emitter.emit("ready");
Ready fired!
.once() auto-removes the listener after it fires the first time — the second emit("ready") has no listeners left to call.
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.