Events and EventEmitter in Node.js

|
| By Sahil Kumar

What Are Events in Node.js?

Node.js is designed around an event-driven architecture. This means that instead of waiting for tasks like file operations or HTTP requests to finish, Node.js uses events to signal when these tasks are complete.

To manage this system, Node.js provides a built-in module called events, which includes the EventEmitter class. This class lets you create, emit, and respond to your own custom events.

 

Setting Up EventEmitter

Start by requiring the built-in events module as shown below:

const EventEmitter = require(‘events’);

const myEmitter = new EventEmitter();

 

Emitting and Listening for Events

Step 1: Register a listener

myEmitter.on(‘sayHello’, () => {

console.log(‘Hello there!’);

});

 

Step 2: Emit the event
  • myEmitter.emit(‘sayHello’);

 

Output:

Hello there!

 

Sending Data with Events

You can also pass arguments when triggering events:

myEmitter.on(‘order’, (item, quantity) => {

  console.log(`Order received: ${quantity} ${item}(s)`);

});

myEmitter.emit(‘order’, ‘coffee’, 2);

 

Output:

Order received: 2 coffee(s)

 

one-time Listener with .once()

If you only want to respond to an event a single time:

myEmitter.once(‘login’, () => {

  console.log(‘User logged in for the first time’);

});

myEmitter.emit(‘login’);

myEmitter.emit(‘login’); // This won’t trigger the callback again

Output:

Removing Listeners

Listeners can be detached using .off() or .removeListener() methods.

const EventEmitter = require(‘events’);

const myEmitter = new EventEmitter();

const greet = () => console.log(‘Hi!’);

myEmitter.on(‘greet’, greet);

myEmitter.emit(‘greet’);

// Remove the listener

myEmitter.off(‘greet’, greet);

//Called After Remove 

myEmitter.emit(‘greet’);

Output:

Where It’s Used in Node.js

The EventEmitter pattern is used all over the place in Node.js:

  • HTTP servers (request, response events)
  • File streams (data, end)
  • Sockets (connect, disconnect)
  • Child processes, and more

Example with HTTP:

const http = require(‘http’);

const server = http.createServer((req, res) => {

  res.end(‘Hello!’);

});

server.on(‘request’, (req) => {

  console.log(`Request received: ${req.method} ${req.url}`);

});

server.listen(3000);

Output: 

Summary

  • Node.js handles asynchronous code using a system based on events, allowing tasks to run without halting the main program flow.
  • This approach supports building responsive, loosely coupled, and non-blocking applications.

Leave a Reply

Your email address will not be published. Required fields are marked *