Chapter 10 of 12
Node.js is built on an event-driven architecture. The EventEmitter class is at its core — it lets you emit named events and register listeners for them. Understanding it explains how streams, HTTP servers, and many Node APIs work.
const EventEmitter = require("events");
// Create an emitter
const emitter = new EventEmitter();
// Register a listener
emitter.on("data-received", (data) => {
console.log("Received:", data);
});
// Register a one-time listener
emitter.once("connected", () => {
console.log("Connected! (fires only once)");
});
// Emit events
emitter.emit("connected");
emitter.emit("data-received", { id: 1, name: "Nelson" });
emitter.emit("data-received", { id: 2, name: "Alice" });
// Remove a listener
const handler = (data) => console.log(data);
emitter.on("update", handler);
emitter.off("update", handler); // or emitter.removeListener("update", handler)const EventEmitter = require("events");
class DataProcessor extends EventEmitter {
constructor() {
super();
this.processed = 0;
}
process(records) {
for (const record of records) {
// Do work
const result = transform(record);
this.processed++;
// Emit events others can listen to
this.emit("record-processed", result);
if (this.processed % 100 === 0) {
this.emit("progress", { processed: this.processed });
}
}
this.emit("done", { total: this.processed });
}
}
const processor = new DataProcessor();
processor.on("progress", ({ processed }) => {
console.log(`Progress: ${processed} records`);
});
processor.on("done", ({ total }) => {
console.log(`Complete: ${total} records processed`);
});
processor.process(myData);