Patrón Observer en Node.js: Implementación de Event Emitter
Clase 5 de 26 • Curso de Node.js Avanzado
Resumen
El patrón Observer es una forma efectiva usada dentro del Core de Node.js para desarrollar aplicaciones basadas en eventos, permitiendo reaccionar a sucesos específicos mediante el mecanismo llamado Event Emitter. Este mecanismo te posibilita emitir eventos que otros módulos escucharán para ejecutar código determinado, facilitando así una arquitectura de software modular y claramente organizada.
¿qué es el patrón Observer y cómo lo utiliza Node.js?
El patrón Observer es un modelo de diseño que utiliza el Event Emitter en Node.js, donde un objeto recibe notificaciones al ocurrir ciertos eventos y responde para ejecutar una acción específica. Este patrón, conocido también como patrón de observadores, permite:
- Emitir eventos (emit).
- Escuchar eventos (on).
Se implementa creando clases que extienden del Event Emitter del núcleo de Node.js, para beneficiarse de estas capacidades directamente desde la base.
¿cómo construir un Notificador de registro de usuarios con Event Emitter?
Para implementar el Observer, partimos creando un archivo llamado Notifier
donde importamos primero el módulo EventEmitter proporcionado por Node.js:
const EventEmitter = require("node:events");
class UserNotifier extends EventEmitter {}
module.exports = new UserNotifier();
Esta estructura básica ofrece seguridad al usar explícitamente el prefijo node:
evitando vulnerabilidades en paquetes maliciosos publicados en registros externos.
¿qué pasos seguir para ejecutar eventos y respuestas?
Siguiendo la estructura de Observer, el flujo general consta de emisores (emitters) y escuchadores (listeners):
emitimos un evento de usuario registrado
Creamos una función llamada RegisterUser
que, además de simular un registro de usuario, emite el evento userRegister
:
const notifier = require('./Notifier');
function RegisterUser(user) {
console.log('Registrando usuario');
notifier.emit('userRegister', user);
return user;
}
escuchamos eventos específicos
Para reaccionar a cada evento necesitamos crear módulos escuchadores dedicados. Ejemplo con un EmailListener
y un StatsListener
:
- EmailListener.js
const notifier = require('../Notifier');
notifier.on('userRegister', (user) => {
console.log(`Enviar email a ${user.email}`);
});
- StatsListener.js
const notifier = require('../Notifier');
notifier.on('userRegister', (user) => {
console.log(`Actualizar stats para ${user}`);
});
Estos escuchadores se activan automáticamente cuando el evento se lanza desde el emisor.
¿cómo se implementa y utiliza en el archivo principal o index?
El archivo principal (index.js
) ejecuta el flujo completo, importando únicamente los escuchadores y el emisor:
const registerUser = require('./UserRegistration');
require('./Listeners/EmailListener');
require('./Listeners/StatsListener');
const usuario1 = {nombre: 'Usuario1', email: 'usuario1@correo.com'};
const usuario2 = {nombre:'Usuario2', email: 'usuario2@correo.com'};
registerUser(usuario1);
registerUser(usuario2);
Al ejecutarse este código, los eventos previamente definidos son emitidos, y cada listener responde ejecutando las acciones definidas, como enviar correos electrónicos o actualizar estadísticas, permitiendo verificar en consola la ejecución correcta:
Registrando usuario
Enviar email a usuario1@correo.com
Actualizar stats para [Object object]
Registrando usuario
Enviar email a usuario2@correo.com
Actualizar stats para [Object object]
¿cuáles son las recomendaciones de seguridad y mejores prácticas?
Para disminuir riesgos en proyectos Node.js al usar módulos nativos del entorno, se recomienda explícitamente indicar el módulo utilizando la anotación:
require("node:módulo")
Esta medida previene ataques posibles mediante publicación maliciosa de paquetes externos en NPM.
¿qué ejercicios prácticos puedes realizar para dominar EventEmitter?
Para profundizar en el patrón Observer utilizando Event Emitter, conviene realizar ejercicios prácticos como:
- Simular otro tipo de evento, como el de la creación de un post por un usuario (
postCreated
). - Implementar diferentes escuchadores, como estadísticas relacionadas con posts o notificaciones específicas cuando un post se publique en un canal de blog o similar.
- Emitir eventos con diferentes objetos de información para practicar y afianzar su correcta gestión dentro de la arquitectura basada en eventos.
Te invito a aplicar estos ejercicios adicionales para ganar seguridad y fluidez en el manejo de eventos con Node.js. ¿Tienes alguna pregunta específica sobre cómo seguir?