Loading...

Creating and Using Custom Events in Node.js

Creating and Using Custom Events in Node.js

Jeevan Singh

27 October, 2025

Node.js Logo


Node.js is built around an event-driven architecture, which makes it incredibly efficient for handling asynchronous operations. Events are at the core of Node.js — they allow you to execute code when specific actions occur. While Node.js provides many built-in events (like request and connection), you can also create your own custom events to make your applications more modular and interactive.

What Are Events in Node.js?

An event in Node.js is a signal that something has happened in your application. For example, when a server receives a request, an event is triggered.
Node.js uses the EventEmitter class from the events module to handle such event-driven behavior.

Why Use Custom Events?

Custom events make your code cleaner, more organized, and easier to maintain. They are particularly useful when:

  • You want to separate logic between components.
  • You need to notify different parts of your app when an action occurs.
  • You’re working with asynchronous operations that depend on specific triggers.
  • You want to create modular, reusable systems that communicate via events.

The EventEmitter Class

The EventEmitter class in Node.js is the foundation for handling and creating custom events. It allows you to:

  • emit an event — trigger it.
  • on or addListener — listen for when the event occurs.
  • once — listen for the event only one time.
  • removeListener — stop listening to an event.

To use custom events, you first need to import this class and create an instance of it.

Example: Creating and Listening to a Custom Event

Here’s a simple example to demonstrate how to create and trigger your own event:

const EventEmitter = require('events');

// Create an instance of EventEmitter
const eventEmitter = new EventEmitter();

// Define a custom event
eventEmitter.on('greet', (name) => {
  console.log(`Hello, ${name}! Welcome to Node.js events.`);
});

// Trigger (emit) the custom event
eventEmitter.emit('greet', 'John');

In this example:

  • We created a custom event called greet.
  • We used on() to listen for the event.
  • We used emit() to trigger the event and pass data (“John”).

Using Multiple Listeners

You can also attach multiple listeners to the same event:

const EventEmitter = require('events');
const eventEmitter = new EventEmitter();

eventEmitter.on('status', () => console.log('Task started!'));
eventEmitter.on('status', () => console.log('Task in progress...'));
eventEmitter.on('status', () => console.log('Task completed!'));

eventEmitter.emit('status');

When emit('status') is called, all listeners attached to the status event are executed in order.

Using once() for One-Time Events

If you want an event listener to run only once, you can use the once() method:

const EventEmitter = require('events');
const eventEmitter = new EventEmitter();

eventEmitter.once('connect', () => {
  console.log('Connected successfully! This message appears only once.');
});

eventEmitter.emit('connect');
eventEmitter.emit('connect'); // Won’t run again

This is useful for tasks like initializing a database connection or logging one-time startup messages.

Passing Data with Events

You can pass any number of arguments to your event listeners via emit():

eventEmitter.on('order', (item, price) => {
  console.log(`Order placed for ${item} costing $${price}`);
});

eventEmitter.emit('order', 'Laptop', 1200);

This flexibility allows you to send relevant data dynamically whenever the event is triggered.

Removing Event Listeners

If you no longer need a listener, you can remove it using removeListener() or removeAllListeners():

const greet = (name) => console.log(`Hello, ${name}!`);
eventEmitter.on('greet', greet);

eventEmitter.removeListener('greet', greet);
eventEmitter.emit('greet', 'John'); // No output since listener removed

Real-World Example: File Upload Notification

Custom events are extremely useful in real-world applications. For example:

const EventEmitter = require('events');
const eventEmitter = new EventEmitter();

function uploadFile(filename) {
  console.log(`Uploading ${filename}...`);
  setTimeout(() => {
    eventEmitter.emit('uploadSuccess', filename);
  }, 2000);
}

eventEmitter.on('uploadSuccess', (file) => {
  console.log(`File "${file}" uploaded successfully!`);
});

uploadFile('profile-picture.png');

Here, the uploadFile() function triggers a custom event after the simulated upload completes, and another part of the app listens for that event to perform follow-up actions.

Conclusion

Custom events make Node.js applications more modular, scalable, and easier to manage. By using the EventEmitter class, you can define custom triggers and listeners that communicate between different parts of your app seamlessly.
Whether you’re building APIs, file systems, or chat applications, mastering custom events is an essential step toward writing cleaner and more efficient Node.js code.

RECENT POSTS

How Staff Augmentation Solves the Tech Talent Shortage for BFSI and Fintech Enterprises

Last quarter, a mid-sized NBFC we work with needed four senior Java developers to migrate their loan management system before RBI’s new compliance deadline. Their HR team had been running the hiring process for eleven weeks. Three offers were made. Two candidates ghosted after accepting, one joined a competitor for a better package mid-negotiation. The […]

Common Mistakes Companies Make When Outsourcing Software Development (And How BFSI Firms Can Avoid Them)

At Speqto Technologies, we’ve spent the better part of a decade building software for banks, NBFCs, insurance companies, and fintech startups. Over that time, we’ve seen the same outsourcing mistakes repeat themselves across companies that otherwise have sharp business instincts. Financial services leaders know how to evaluate risk in lending books or investment portfolios, but […]

Why API-First Architecture Matters for BFSI Digital Products

A few months back, we sat in a review call with an NBFC client whose loan origination system had grown into a genuine mess. Every time they wanted to launch a new lending product or plug in a fresh credit bureau, their engineering team had to rebuild integration logic from scratch. Six weeks of “simple […]

How Custom Workflow Automation Cuts Operational Risk in BFSI — Lessons From the Field

Ask any operations head at a bank, NBFC, or fintech where their biggest risk actually lives, and rarely will the answer be “cybersecurity” or “market risk.” More often, it’s something far less glamorous — a reconciliation sheet that someone forgot to update, an approval that sat in an inbox for four days, or a compliance […]

How Fintech Startups Can Build Secure, Scalable Platforms Fast

Every fintech founder we’ve worked with at Speqto Technologies has faced the same dilemma at some point: ship fast to grab market share, or slow down and build things properly. The good news is that this isn’t actually an either-or choice. We’ve helped payment platforms, NBFCs, and digital lending startups launch in months, not years, […]

POPULAR TAG

POPULAR CATEGORIES