What is the 'EventEmitter' Class in Node.js?
The EventEmitter class is part of Node.js's core library and belongs to the events module. It provides a mechanism for handling and emitting events. In Node.js, many built-in modules inherit from EventEmitter, such as http, fs, and stream, enabling objects to listen for and emit events.
Basic Usage of EventEmitter
To use EventEmitter, you must first import the events module and create an instance of the EventEmitter class.
javascriptconst EventEmitter = require('events'); const emitter = new EventEmitter();
Event Listening
Use the on method to listen for events, executing a callback when the specified event is emitted.
javascriptemitter.on('event_name', function(data) { console.log('An event occurred!', data); });
Event Emitting
Use the emit method to trigger events, passing any number of arguments to the callback function of the listener.
javascriptemitter.emit('event_name', { message: 'Hello world!' });
Advanced Usage of EventEmitter
One-time Listeners
If you want the event handler to execute only once, use the once method instead of on.
javascriptemitter.once('event_name', function(data) { console.log('This will only be logged once', data); });
Removing Listeners
You can remove specific listeners using the removeListener or off method.
javascriptconst callback = function(data) { console.log('This will be removed later', data); }; emitter.on('event_name', callback); // Later emitter.removeListener('event_name', callback);
Error Events
It is recommended to listen for the error event to handle potential errors.
javascriptemitter.on('error', (err) => { console.error('An error occurred:', err); });
Practical Example
A typical use case is handling requests and responses in an HTTP server. In Node.js's http module, the server object emits a 'request' event each time a request is received, allowing developers to listen for this event to respond to client requests.
javascriptconst http = require('http'); const server = http.createServer(); server.on('request', (req, res) => { if (req.url === '/') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Home Page'); } else if (req.url === '/about') { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('About Page'); } else { res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Not Found'); } }); server.listen(3000, () => { console.log('Server is running on port 3000'); });
In this example, the server listens for the 'request' event to handle different URL requests. This pattern is very common in Node.js, making event-driven programming a powerful and flexible approach for handling various asynchronous operations.