Middleware: ordine e next
Prima di iniziare: le parole della lezione
- Catena di middleware e next
- La catena è la sequenza registrata nell’app.
next()passa il controllo alla funzione successiva compatibile;next(err)attiva il percorso di gestione errori. - Autenticazione e autorizzazione
- L’autenticazione verifica chi è il chiamante; l’autorizzazione verifica se può compiere quella specifica operazione.
- Logging e gestione errori
- Il logging registra eventi utili a capire il comportamento del programma. Un gestore errori traduce un problema in una risposta controllata.
Un middleware è una funzione che opera tra richiesta e risposta. Può leggere/modificare req, rispondere o passare il controllo con next(); l'ordine di registrazione conta.
app.use((req, res, next) => {
console.log(req.method, req.path);
next();
});
app.use(express.json());
app.get('/salute', (req, res) => res.json({ ok: true }));
app.use((req, res) => res.status(404).json({ errore: 'Route inesistente' }));
Esempio aggiuntivo: un middleware di autenticazione può controllare una sessione prima delle route private. Attenzione: se non invii una risposta e non chiami next(), la richiesta resta in sospeso. Un middleware di errore ha firma (err, req, res, next).
Chi fa cosa, e perché
Nel testo il middleware viene prima scritto nel file principale, poi esportato in un modulo e infine applicato solo a un prefisso. app.use("/api", fn) limita la funzione a quel gruppo; app.get("/profilo", controllo, handler) la lega a una route. Puoi passare più middleware o un array di funzioni.
Un middleware ha tre possibilità: risponde e si ferma, chiama next, oppure segnala un errore. next() non equivale a return: il codice dopo può ancora eseguire. Usa return next() quando vuoi terminare subito il ramo. Un middleware che stampa “accesso effettuato” non autentica realmente nessuno.
Un altro esempio guidato
// Frammento: middleware specifico per una route
function richiediFormatoJson(req, res, next) {
if (!req.is('application/json')) {
return res.status(415).json({ errore: 'Invia application/json' });
}
return next();
}
app.post('/api/eco', richiediFormatoJson, express.json(), (req, res) => {
res.json({ ricevuto: req.body });
});
// Evita di registrare anche un'altra POST /api/eco prima di questa.
Come leggerlo e risultato atteso. Il controllo legge il Content-Type e può rispondere 415, formato non supportato. Se passa, il parser interpreta JSON e l’handler risponde. L’ordine è controllo del formato → parser → handler; l’esempio assume che un parser globale precedente non abbia già letto il body.
Prova tu. Aggiungi log prima e dopo next e osserva l’ordine. Scrivi poi una 404 prima della route: vedrai perché quella route non viene più raggiunta.