COMO CREAR UN MIDDLEWARE EN NODEJS EN EXPRESS

Un middleware en NodeJS es una función que se ejecuta en el flujo de procesamiento de una solicitud HTTP, entre la recepción de la solicitud y el envío de la respuesta. Un middleware pueden realizar tareas como validar datos, autenticar usuarios, registrar solicitudes, etc.
En este post explico como crear un middleware en Express . Un middleware en Express es una función que recibe tres parámetros:
  • req: Objeto de la solicitud (request).
  • res: Objeto de la respuesta (response).
  • next: Función que pasa el control al siguiente middleware o ruta en la cadena.
Ejemplos:
  • Middleware global:

    const app = express();
    
    // Middleware personalizado
    const miMiddleware = (req, res, next) => {
      console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
      next(); // Continúa con el siguiente middleware o ruta
    };
    
    // Registrar el middleware globalmente
    app.use(miMiddleware);
    
    app.get('/', (req, res) => {
      res.send('¡Hola, mundo!');
    });
    
    app.listen(3000, () => {
      console.log('Servidor en puerto 3000');
    });
    
    En el middleware de este ejemplo registra en la consola la fecha, el método HTTP y la URL de cada solicitud antes de pasar al siguiente manejador.

  • Middleware para rutas específicas:

    const express = require('express');
    const app = express();
    
    const miMiddleware = (req, res, next) => {
      if (req.query.token === '12345') {
        next(); // Token válido, pasa al siguiente manejador
      } else {
        res.status(403).send('Acceso denegado: Token inválido');
      }
    };
    
    // Aplica el middleware solo a la ruta /protegida
    app.get('/protegida', miMiddleware, (req, res) => {
      res.send('¡Acceso permitido a la ruta protegida!');
    });
    
    app.get('/', (req, res) => {
      res.send('Ruta pública');
    });
    
    app.listen(3000, () => {
      console.log('Servidor en puerto 3000');
    });
    
    En el middleware de este ejemplo verifica si la solicitud incluye un parámetro token=12345 en la URL (por ejemplo, /protegida?token=12345). Si es válido, permite el acceso; si no, responde con un error 403.

  • Middleware con parámetros:

    const express = require('express');
    const app = express();
    
    const verificarRol = (rol) => {
      return (req, res, next) => {
        if (req.query.rol === rol) {
     next();
        } else {
     res.status(403).send(`Acceso denegado: Se requiere rol ${rol}`);
        }
      };
    };
    
    // Aplica el middleware con un parámetro específico
    app.get('/admin', verificarRol('admin'), (req, res) => {
      res.send('Bienvenido, administrador');
    });
    
    app.get('/usuario', verificarRol('user'), (req, res) => {
      res.send('Bienvenido, usuario');
    });
    
    app.listen(3000, () => {
      console.log('Servidor en puerto 3000');
    });
    
    En el middleware de este ejemplo "verificarRol" toma un parámetro rol y verifica si la solicitud incluye ese rol en la query (por ejemplo, /admin?rol=admin). Esto permite reutilizar el middleware con diferentes valores.

  • Manejo de errores con middleware: Un middleware de manejo de errores tiene cuatro parámetros (err, req, res, next) y se usa para capturar errores en la aplicación:

    const express = require('express');
    const app = express();
    
    // Middleware normal
    app.use((req, res, next) => {
      if (req.query.id) {
        next();
      } else {
        next(new Error('Falta el parámetro id')); // Pasa un error al middleware de errores
      }
    });
    
    // Ruta
    app.get('/', (req, res) => {
      res.send('Solicitud exitosa');
    });
    
    // Middleware de manejo de errores
    app.use((err, req, res, next) => {
      console.error(err.message);
      res.status(500).send('Error: ' + err.message);
    });
    
    app.listen(3000, () => {
      console.log('Servidor en puerto 3000');
    });
    
    En el middleware de este ejemplo el middleware genera un error si falta el parámetro id en la solicitud. que es capturado por el middleware de manejo de errores, enviando una respuesta con estado 500.

Crear un middleware en Express es sencillo: se define una función con req, res y next, se implementa la lógica deseada y se registras con app.use o en rutas específicas. Los middlewares son muy versátiles y permiten manejar tareas como autenticación, validación, logging, etc., de manera modular y reusable.