EventEmitter er en core Node-klasse, der implementerer publish/subscribe-mønsteret: objekter udsender navngivne begivenheder, og lyttere registreret til disse begivenheder køres når de udløses. Meget af Nodes eget API (streams, HTTP-servere, process) er bygget på det.
Grundlæggende brug
import { EventEmitter } from "events";
const emitter = new EventEmitter();
// SUBSCRIBE: register a listener for an event
emitter.on("order", (order) => {
console.log(`Processing order ${order.id}`);
});
// PUBLISH: emit the event (with optional data)
emitter.emit("order", { id: 123 }); // → "Processing order 123"
Mønsteret: on(event, listener) abonnerer; emit(event, ...args) udløser synkront alle lyttere til denne begivenhed og sender argumenterne videre.
Udvidelse af EventEmitter til dine egne klasser
class OrderService extends EventEmitter {
placeOrder(order) {
// ...save the order...
this.emit("order:created", order); // notify anyone interested
}
}
const service = new OrderService();
service.on("order:created", (o) => sendEmail(o)); // decoupled listeners
service.on("order:created", (o) => updateAnalytics(o));
service.placeOrder({ id: 1 }); // both listeners run
Dette afkoblet emitteren fra dens lyttere — OrderService ved ikke eller bekymrer sig ikke om hvem der lytter, så du kan tilføje reaktioner (e-mail, analyse, logging) uden at ændre den.
Nyttige metoder
emitter.once("ready", fn); // listener runs only ONCE, then auto-removes
emitter.off("order", fn); // remove a listener (prevent leaks)
emitter.emit("error", new Error()); // "error" is special — throws if no listener!
emitter.listenerCount("order");
To vigtige faldgruber
⚠️ Memory leaks: forgetting to remove listeners (use off/once). Node warns at >10
listeners on one event ("possible EventEmitter memory leak").
⚠️ The "error" event: if emitted with no listener, Node THROWS and may crash —
always attach an error listener to emitters that can error (streams!).
Hvor den bruges i Node selv
streams (data, end, error events), http.Server (request event),
process (SIGTERM, exit), sockets — all are EventEmitters.
Hvorfor det betyder noget
EventEmitter er grundlaget for Nodes event-drevet arkitektur — at forstå den forklarer hvordan streams, servere og process-objektet fungerer (de er alle emittere), og det er standardværktøjet til afkoblet, event-baseret kommunikation i din egen kode.
At kende on/emit/once/off-API'et, hukommelsesforsvindings-risikoen fra ufjernede lyttere og den særlige kraksfremkaldende error-begivenhed, er essentielt både for at bruge Nodes API'er korrekt og for at bygge vedligeholdelige event-drevet systemer.
