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.
