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 Blockchain Is Quietly Entering Mainstream BFSI Operations

Nobody in banking wants to talk about blockchain anymore — at least not the way they did in 2018, when every conference deck had a slide promising to “disrupt finance forever.” That noise has died down. But something quieter and more useful has taken its place: banks, NBFCs, and insurers are actually using distributed ledger […]

Smart Contract Security: What Businesses Must Verify Before Launch

Last year, a mid-sized lending platform in the UAE lost close to $2.3 million because of a single unchecked reentrancy pattern in their loan disbursement contract. The code had passed two internal reviews. It looked clean. It wasn’t. This is the kind of story that keeps BFSI and fintech leaders up at night, and honestly, […]

Building a Wallet or Points-Based Loyalty System for Fintech: What Actually Works

Every fintech founder we talk to eventually asks the same question: “Should we build a wallet-based rewards system or a points-based one?” It sounds like a small product decision, but it shapes your compliance load, your tech architecture, and honestly, how fast you can ship features later. At Speqto Technologies, we’ve built both types for […]

What CTOs Should Ask Before Hiring an Offshore Dev Team (Especially in BFSI and Fintech)

A few months back, a VP of Engineering at a mid-sized lending platform told us something that stuck: “We didn’t lose money because the offshore team couldn’t code. We lost money because nobody asked who owns the AWS root account.” That one sentence captures most of what goes wrong in offshore hiring decisions. It’s rarely […]

Reducing Loan Processing Time Through Workflow Automation: What Actually Works in BFSI

Every NBFC and fintech lender we’ve worked with at Speqto Technologies starts with the same complaint: loan files are stuck somewhere between “submitted” and “disbursed,” and nobody can say exactly where or why. Not because the team is slow, but because the process is scattered across emails, PDFs, spreadsheets, and three different logins that don’t […]

POPULAR TAG

POPULAR CATEGORIES