Una tubería ordenada
En Express los middlewares forman una cadena (una pipeline). La petición los atraviesa en el orden en que se registran, y cada eslabón decide:
- llamar a
next()para ceder el control al siguiente, o - responder (
res.json,res.status…) y no llamar anext(), lo que corta la cadena ahí mismo.
app.use(logger); // 1.º para TODAS las rutas
app.use(requiereAuth); // 2.º
app.get("/tareas", listarTareas); // handler final
Si requiereAuth responde un 401, el handler listarTareas nunca se ejecuta:
la petición ya está resuelta.
Global vs. por ruta
- Global (
app.use(fn)): se aplica a todas las peticiones. Útil para logging, parseo del cuerpo, cabeceras comunes. - Por ruta (
app.get("/admin", requiereAuth, handler)): se aplica solo a esa ruta. Útil cuando la comprobación no tiene sentido en todas partes.
Middleware de aplicación (logging)
Un caso clásico es registrar cada petición. El middleware suele enriquecer
el objeto req (añadirle datos) o anotar en algún sitio antes de pasar el testigo:
function logger(req, res, next) {
req.momento = Date.now(); // enriquece la petición
console.log(req.method, req.url);
next(); // ¡imprescindible para no colgar la petición!
}
Regla de oro: un middleware que no responde debe llamar a
next(). Si lo olvida, la petición se queda colgada para siempre.