The events Module and EventEmitter in Node.js

 

Ever wondered how Node.js handles real-time events?

Imagine you’re at a rock concert:
The band plays music (an event happens).
The crowd cheers and claps (listeners react).

That’s exactly how the events module in Node.js works! Instead of fans, your app has event listeners that respond when an event is emitted.

In this guide, we’ll cover:

  • What is the events module?
  • How does EventEmitter work?
  • Real-world examples (custom events, multiple listeners, error handling, and async events).

Ready? Let’s dive in!

What Is the events Module?

Node.js is event-driven. This means it can:

  • Emit (trigger) events
  • Listen (react) to those events

And the best part? The events module is built into Node.js, so there’s no need to install anything!

Just import it like this:

const EventEmitter = require('events');

Why use events?

  • Makes async programming easier
  • Prevents callback hell
  • Perfect for real-time apps (chat apps, notifications, etc.)

Creating an EventEmitter

To use EventEmitter, you create an instance of it:

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

Now, you can start emitting and listening to events like a pro!

Emitting and Listening to Events

Let’s create an event and listen to it!

eventEmitter.on('greet', () => {
    console.log('Hello, Node.js world!');
});

eventEmitter.emit('greet');

Output:

Hello, Node.js world! 

How does it work?

  • on('greet', callback) → Listens for the "greet" event.
  • emit('greet') → Triggers the event.

Passing Data with Events

What if you need to send data with an event?

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

eventEmitter.emit('sayHello', 'Alice');
eventEmitter.emit('sayHello', 'Bob');

Output:

Hello, Alice!   
Hello, Bob!   

 Why use this?

  • Send dynamic data when an event is triggered.
  • Great for chat apps, logging, and notifications!

Handling Multiple Listeners

An event can have multiple listeners:

eventEmitter.on('order', () => console.log(' Order placed!'));
eventEmitter.on('order', () => console.log(' Sending email confirmation...'));

eventEmitter.emit('order');

Output:

Order placed!  
Sending email confirmation...  

Use case:
When an order is placed, multiple actions happen simultaneously.

Using .once() for One-Time Events

Sometimes, you want a listener that runs only once (like a limited-time offer ).

Use .once() instead of .on():

eventEmitter.once('discount', () => {
    console.log(' You got a 50% discount!');
});

eventEmitter.emit('discount'); // Runs   
eventEmitter.emit('discount'); // Ignored   

 Output:

 You got a 50% discount!  

Removing Event Listeners

You can remove an event listener using .off() or .removeListener().

const sayBye = () => console.log('Goodbye! ');

eventEmitter.on('farewell', sayBye);
eventEmitter.emit('farewell'); // Runs   

eventEmitter.off('farewell', sayBye);
eventEmitter.emit('farewell'); // Ignored   

 Output:

Goodbye!  

 Why remove listeners?

  • Prevent memory leaks.
  • Stop unnecessary event triggers.

 Handling Errors with error Events

Node.js crashes if an "error" event isn’t handled!

eventEmitter.on('error', (err) => {
    console.error(' Error:', err.message);
});

eventEmitter.emit('error', new Error('Database failed!'));

 Output:

 Error: Database failed!  

 Always handle errors!

Extending EventEmitter in a Class

For real-world apps, extend EventEmitter inside a class:

class Logger extends EventEmitter {
    log(message) {
        console.log(` ${message}`);
        this.emit('logMessage', message);
    }
}

const logger = new Logger();

logger.on('logMessage', (msg) => console.log(`Logged: ${msg}`));

logger.log('Event-driven logging in action!');

 Output:

 Event-driven logging in action!  
 Logged: Event-driven logging in action!  

Making Events Asynchronous

By default, event listeners run synchronously. But you can make them async!

eventEmitter.on('asyncTask', async () => {
    await new Promise(resolve => setTimeout(resolve, 2000));
    console.log(' Async task completed!');
});

console.log('⏳ Starting async task...');
eventEmitter.emit('asyncTask');
console.log(' Moving on...');

Output:

 Starting async task...  
 Moving on...  
 Async task completed! (after 2 seconds)  

Conclusion

Now you're an EventEmitter pro!

  • You can emit, listen, and handle events.
  • You understand error handling, async events, and removing listeners.
  • You know how to extend EventEmitter in a class for better organization.

Happy coding!

 

Post a Comment

0 Comments