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.