Federico Lelli / SchoolNode.js & Express
LEZIONE 22 · Express e API

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.

Torna all’indice ↑

Materiali didattici curati e rielaborati da Federico Lelli. Le fonti e i riferimenti specifici sono indicati nei materiali disponibili.