Um pipeline ordenado
No Express, os middlewares formam uma cadeia (um pipeline). A requisição os atravessa na ordem em que são registrados, e cada elo decide:
- chamar
next()para ceder o controle ao próximo, ou - responder (
res.json,res.status…) e não chamarnext(), o que interrompe a cadeia ali mesmo.
app.use(logger); // 1.º para TODAS as rotas
app.use(requerAuth); // 2.º
app.get("/tarefas", listarTarefas); // handler final
Se requerAuth responder com um 401, o handler listarTarefas nunca roda:
a requisição já está resolvida.
Global vs. por rota
- Global (
app.use(fn)): aplica-se a todas as requisições. Útil para logging, parse do corpo, cabeçalhos comuns. - Por rota (
app.get("/admin", requerAuth, handler)): aplica-se apenas a essa rota. Útil quando a verificação não faz sentido em todo lugar.
Middleware de aplicação (logging)
Um caso clássico é registrar cada requisição. O middleware costuma enriquecer
o objeto req (adicionar dados a ele) ou anotar algo em algum lugar antes de passar o bastão:
function logger(req, res, next) {
req.momento = Date.now(); // enriquece a requisição
console.log(req.method, req.url);
next(); // imprescindível para não pendurar a requisição!
}
Regra de ouro: um middleware que não responde deve chamar
next(). Se ele esquecer, a requisição fica pendurada para sempre.