The EventEmitter class is the foundation of Node.js event-driven architecture, enabling communication between objects through events.
Basic Usage#
Event Methods#
Removing Listeners#
Error Handling#
Custom Event Emitter Class#
Async Events#
Event Patterns#
Configuration#
Real-World Examples#
Memory Management#
TypeScript Support#
Best Practices#
Event Design:
✓ Use descriptive event names
✓ Namespace events (user:login)
✓ Document event payloads
✓ Always handle 'error' events
Memory Management:
✓ Remove listeners when done
✓ Use once() for one-time events
✓ Set appropriate maxListeners
✓ Clean up in destroy/cleanup methods
Error Handling:
✓ Always add error listener
✓ Use try/catch in async handlers
✓ Emit errors, don't throw
✓ Log unhandled errors
Performance:
✓ Avoid too many listeners
✓ Use removeAllListeners sparingly
✓ Consider event pooling for high volume
✓ Profile listener execution time
Avoid:
✗ Anonymous functions (can't remove)
✗ Memory leaks from listeners
✗ Throwing in event handlers
✗ Ignoring error events
Conclusion#
The EventEmitter is central to Node.js async architecture. Use it to build decoupled, event-driven systems. Always handle error events, clean up listeners to prevent memory leaks, and consider using once() for single-use events. The async utilities (once, on) enable promise-based event handling. For TypeScript, create typed emitter classes for better type safety.