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.
- Middleware global:
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.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'); });
- Middleware para rutas específicas:
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.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'); });
- Middleware con parámetros:
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.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'); });
- 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:
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.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'); });