IMHO, la risposta accettata a questa domanda non è veramente accurata. Come altri hanno affermato, si tratta davvero di controllare quando viene eseguito il prossimo handler nella catena. Ma volevo fornire un po 'più di codice per renderlo più concreto. Supponi di avere questa semplice app express:
var express = require('express');
var app = express();
app.get('/user/:id', function (req, res, next) {
console.log('before request handler');
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
next();
});
app.get('/user/:id', function (req, res, next) {
console.log('after request handler');
next();
});
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
});
Se fate
curl http://localhost:3000/user/123
vedrai questo stampato su console:
before request handler
handling request
after request handler
Ora, se commentate la chiamata a next()
in the middle handler in questo modo:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Vedrai questo sulla console:
before request handler
handling request
Notare che l'ultimo gestore (quello che stampa after request handler
) non viene eseguito. Questo perché non stai più dicendo a Express di eseguire il prossimo gestore.
Quindi non importa se il tuo gestore "principale" (quello che restituisce 200) ha avuto successo o meno, se vuoi che il resto del middleware funzioni, devi chiamare next()
.
Quando sarebbe tornato utile? Supponiamo che tu voglia registrare tutte le richieste pervenute a un database indipendentemente dal fatto che la richiesta abbia avuto successo o meno.
app.get('/user/:id', function (req, res, next) {
try {
// ...
}
catch (ex) {
// ...
}
finally {
// go to the next handler regardless of what happened in this one
next();
}
});
app.get('/user/:id', function (req, res, next) {
logToDatabase(req);
next();
});
Se vuoi che il secondo gestore venga eseguito, devi chiamare next()
il primo gestore.
Ricorda che il nodo è asincrono, quindi non può sapere quando il callback del primo gestore è terminato. Devi dirlo chiamando next()
.