The events module provides the EventEmitter class for building event-driven applications. Here's how to use it effectively.
Basic EventEmitter#
Once Listeners#
Custom Event Emitter Class#
Error Handling#
Async Events#
Event Names and Listeners#
Removing Listeners#
Prepending Listeners#
Max Listeners#
Event-Based Queue#
Pub/Sub Pattern#
Typed Events (TypeScript)#
Promise-Based Events#
Best Practices#
Patterns:
✓ Always handle 'error' events
✓ Use descriptive event names
✓ Namespace events (user:login)
✓ Document event signatures
Memory:
✓ Remove listeners when done
✓ Use once() for single events
✓ Set appropriate maxListeners
✓ Clean up in destroy methods
Async:
✓ Handle async errors
✓ Use once() for promises
✓ Consider event ordering
✓ Emit after state changes
Avoid:
✗ Circular event emissions
✗ Heavy work in handlers
✗ Ignoring error events
✗ Memory leaks from listeners
Conclusion#
The events module provides a solid foundation for event-driven architecture in Node.js. Extend EventEmitter for custom classes, always handle error events, and manage listeners properly to avoid memory leaks. Use typed events in TypeScript for better developer experience and use the once function for promise-based event handling.