Intermediate Node.js Interview QuestionsIntermediateConcept
Node.js · Question 57
How do EventEmitter memory leaks happen in Node.js?
Direct answer
Leaks occur when listeners are added repeatedly without removal — setMaxListeners warns at 10 by default; fix with off/removeListener, once, or WeakRef patterns; hot-reload and long-lived servers are common culprits.
Each on() keeps a closure alive referencing outer scope — duplicate subscriptions on every request without cleanup accumulate until MaxListenersExceededWarning and OOM.
Why interviewers ask
- Repeated subscribe — db.on('connect') inside handler instead of once at startup.
- Missing cleanup — WebSocket close should removeListener on shared emitter.
- setMaxListeners — raise only when legitimately many listeners; not a fix for leaks.
- process warnings — MaxListenersExceededWarning signals investigation.
emitter-leak-fix.mjs
import { EventEmitter } from "node:events";
const bus = new EventEmitter();
function subscribeOnce(jobId, handler) {
const wrapped = (payload) => {
if (payload.jobId === jobId) {
bus.off("progress", wrapped);
handler(payload);
}
};
bus.on("progress", wrapped);
}
// Anti-pattern: every request adds permanent listener
// function bad(req, res) {
// bus.on("progress", () => res.write("...")); // leak
// }