EVENTOS EN NODE.JS: CÓMO FUNCIONAN Y EJEMPLOS

NodeJS se basa en unmodelo orientado a eventos, lo que lo hace eficiente y escalable. En lugar de esperar a que una tarea termine (bloqueando el programa), Node.js utiliza eventos para notificar cuando ocurre algo importante, permitiendo que el programa continúe ejecutándose sin interrupciones.

Conceptos Básicos

  • EventEmitter: Una clase del módulo events que actúa como el "cerebro" detrás de la gestión de eventos. Permite crear, emitir y manejar eventos de manera sencilla.
  • Emitir un evento: Cuando algo sucede en tu programa, puedes "emitir" un evento con un nombre específico, como "¡Archivo cargado!" o "¡Usuario conectado!".
  • Escuchar un evento: Mediante funciones conocidas como listeners, puedes definir qué hacer cuando un evento específico ocurre.

Cómo funciona

  1. Importar el módulo events: Este módulo proporciona acceso a la clase EventEmitter.
  2. Crear una instancia: Con new EventEmitter() generas un objeto que gestionará tus eventos.
  3. Escuchar eventos: Usando el método .on(nombreEvento, callback), dregistras una función que se ejecutará cuando ocurra el evento especificado..
  4. Emitir eventos: Con .emit(nombreEvento), activas el evento para que todos los listeners asociados se ejecuten..
Ejemplo sencillo:

const EventEmitter = require('events');
const cafetera = new EventEmitter();

// Escuchar el evento con un parámetro
cafetera.on('cafeListo', (tipoCafe) => {
  console.log(`¡El café ${tipoCafe} está listo! Sirviendo...`);
});

// Emitir el evento con un dato
cafetera.emit('cafeListo', 'expresso');
Ejemplo sencillo de eventos con un servidor con express:

// Importamos los módulos necesarios
const express = require('express');
const EventEmitter = require('events');

// Creamos una instancia de Express y de EventEmitter
const app = express();
const eventEmitter = new EventEmitter();

// Escuchar un evento personalizado 'formularioEnviado'
eventEmitter.on('parametroFaltante', (detalles) => {
    console.log('Error: Falta el parámetro '+detalles.parametro+" "+detalles.ruta);
  
  });

// Ruta saludo quye emite el evento
app.get('/saludo/', (req, res) => {
   const { nombre, edad } = req.query; // Recogemos parámetros de consulta

  // Verificamos si falta algún parámetro
  if (!nombre) {
    eventEmitter.emit('parametroFaltante', { parametro: 'nombre', ruta: '/buscar' });
    return res.status(400).send('Error: El parámetro "nombre" es requerido');
  }
  if (!edad) {
    eventEmitter.emit('parametroFaltante', { parametro: 'edad', ruta: '/buscar' });
    return res.status(400).send('Error: El parámetro "edad" es requerido');
  }
  // Responder al cliente
  res.status(200).send('Búsqueda exitosa: Nombre = ${nombre}, Edad = ${edad}');
});

// Iniciar el servidor en el puerto 3000
app.listen(3000, () => {
  console.log('Servidor escuchando en el puerto 3000');
});