Middleware
En Express.js, el middleware es una función que tiene acceso al objeto de solicitud (req), al objeto de respuesta (res) y a la siguiente función de middleware en el ciclo de solicitud-respuesta (next). Se utiliza para ejecutar lógica transversal, como autenticación, logging, manejo de errores, validación de datos o configuración de cabeceras.
Concepto y propósito
Un middleware puede:
- Ejecutar código antes o después de que una solicitud llegue al controlador.
- Modificar objetos
reqyres. - Finalizar el ciclo de solicitud enviando una respuesta directamente.
- Pasar el control al siguiente middleware mediante
next().
Middleware global
El middleware global se aplica a todas las rutas de la aplicación usando app.use():
import express from 'express';
const app = express();
// Middleware global
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
});
Middleware por ruta
También se puede aplicar middleware a rutas específicas:
function verificarAutenticacion(req, res, next) {
if (!req.headers.authorization) {
return res.status(401).send('No autorizado');
}
next();
}
app.get('/perfil', verificarAutenticacion, (req, res) => {
res.send('Página de perfil');
});
Middleware de router
Cuando se usan routers, se pueden aplicar middleware solo a ese grupo de rutas:
const router = express.Router();
router.use(verificarAutenticacion);
router.get('/usuarios', (req, res) => res.send('Lista de usuarios'));
router.post('/usuarios', (req, res) => res.send('Crear usuario'));
app.use('/api', router);
Buenas prácticas y convenciones
- Mantener los middleware enfocados en una sola responsabilidad.
- Reutilizar middleware para lógica común entre varias rutas o routers.
- Evitar lógica de negocio compleja dentro del middleware; delegar a servicios o controladores.
- Nombrar los middleware de forma descriptiva según su función (por ejemplo:
auth,logger,errorHandler). - Aplicar middleware global solo para tareas transversales necesarias, y middleware por ruta o router para casos específicos.