Published at
Updated at
Reading time
2min
This post is part of my Today I learned series in which I share all my web development learnings.

Today I was reading the documentation of events in Node.js and discovered something interesting.

When you use them you usually also use an EventEmitter. Let's have a quick look at an example snippet from the docs.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

The usage is straightforward. Create an emitter, emit events and react to them. Let's change the code above and add a few more event handlers.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
for(let i = 0; i < 11; i++) {
  myEmitter.on('event', _ => console.log(i));
}

myEmitter.emit('event');

And execute it.

$ node index.js
0
1
2
3
4
5
6
7
8
9
10
(node:10031) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 event listeners added. Use emitter.setMaxListeners() to increase limit

Interesting, Node.js sends a warning to stderr when you add more than ten listeners for one specific event to an event emitter. Having 30 listeners reacting to 30 different events is fine, though. If you want to dig a bit deeper, you can find the warning in the Node.js source code.

This warning helps you to prevent memory leaks. Node.js processes can run for ages and when you have a bug in your code and create a new event listener before cleaning up, or you don't use existing ones the memory usage of this process will slowly grow and make troubles on your servers at some point.

It has to be pointed out that this is "just" a warning and the Node.js process will still execute the eleven added listeners. It won't terminate the process, will only appear once per event and it is more about pointing out problems in your source code.

Sometimes you do need more than ten listeners for an event on an event emitter, though. This is the situation, where setMaxListeners comes into play. A function that is also used several times in the Node.js project itself.

const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter();
// increase the limit
myEmitter.setMaxListeners(11);

for(let i = 0; i < 11; i++) {
  myEmitter.on('event', _ => console.log(i));
}

myEmitter.emit('event');

Using setMaxListeners way you can quickly get rid of warnings regarding the number of listeners and go on with coding. I'd say this warning is a pretty good example of good developer experience. ๐Ÿ‘๐Ÿป

If you enjoyed this article...

Join 5.5k readers and learn something new every week with Web Weekly.

Web Weekly โ€” Your friendly Web Dev newsletter
Reply to this post and share your thoughts via good old email.
Stefan standing in the park in front of a green background

About Stefan Judis

Frontend nerd with over ten years of experience, freelance dev, "Today I Learned" blogger, conference speaker, and Open Source maintainer.

Related Topics

Related Articles