The Node Event emitter
How to work with custom events in Node
If you worked with JavaScript in the browser, you know how much of the interaction of the user is handled through events: mouse clicks, keyboard button presses, reacting to mouse movements, and so on.
On the backend side, Node offers us the option to build a similar system using the events
module.
This module, in particular, offers the EventEmitter
class, which we’ll use to handle our events.
You initialize an EventEmitter object using this syntax:
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
This object exposes, among many others, the on
and emit
methods.
emit
is used to trigger an eventon
is used to add a callback function that’s going to be executed when the event is triggered
Emit and listen for events
For example, let’s create a start
event, and as a matter of providing a sample, we react to that by just logging to the console:
eventEmitter.on('start', () => {
console.log('started')
})
When we run
eventEmitter.emit('start')
the event handler function is triggered, and we get the console log.
addListener()
is an alias for on()
, in case you see that used.
Passing arguments to the event
You can pass arguments to the event handler by passing them as additional arguments to emit()
:
eventEmitter.on('start', (number) => {
console.log(`started ${number}`)
})
eventEmitter.emit('start', 23)
Multiple arguments:
eventEmitter.on('start', (start, end) => {
console.log(`started from ${start} to ${end}`)
})
eventEmitter.emit('start', 1, 100)
Listen for an event just once
The EventEmitter object also exposes the once()
method, which you can use to create a one-time event listener.
Once that event is fired, the listener stops listening.
Example:
eventEmitter.once('start', () => {
console.log(`started!`)
})
eventEmitter.emit('start')
eventEmitter.emit('start') //not going to fire
Removing an event listener
Once you create an event listener, you can remove it using the removeListener()
method.
To do so, we must first have a reference to the callback function of on
.
In this example:
eventEmitter.on('start', () => {
console.log('started')
})
Extract the callback:
const callback = () => {
console.log('started')
}
eventEmitter.on('start', callback)
So that later you can call
eventEmitter.removeListener('start', callback)
You can also remove all listeners at once on an event, using:
eventEmitter.removeAllListeners('start')
Getting the events registered
The eventNames()
method, called on an EventEmitter object instance, returns an array of strings that represent the events registered on the current EventListener:
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
eventEmitter.on('start', () => {
console.log('started')
})
eventEmitter.eventNames() // [ 'start' ]
listenerCount()
returns the count of listeners of the event passed as parameter:
eventEmitter.listenerCount('start') //1
Adding more listeners before/after other ones
If you have multiple listeners, the order of them might be important.
An EventEmitter object instance offers some methods to work with order.
emitter.prependListener()
When you add a listener using on
or addListener
, it’s added last in the queue of listeners, and called last. Using prependListener
it’s added, and called, before other listeners.
emitter.prependOnceListener()
When you add a listener using once
, it’s added last in the queue of listeners, and called last. Using prependOnceListener
it’s added, and called, before other listeners.
→ I wrote 17 books to help you become a better developer, download them all at $0 cost by joining my newsletter
→ JOIN MY CODING BOOTCAMP, an amazing cohort course that will be a huge step up in your coding career - covering React, Next.js - next edition February 2025