À mon humble avis, la réponse acceptée à cette question n'est pas vraiment précise. Comme d'autres l'ont dit, il s'agit vraiment de contrôler le moment où le prochain gestionnaire de la chaîne est exécuté. Mais je voulais fournir un peu plus de code pour le rendre plus concret. Disons que vous avez cette application express simple:
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!')
});
Si tu fais
curl http://localhost:3000/user/123
vous verrez ceci imprimé sur la console:
before request handler
handling request
after request handler
Maintenant, si vous commentez l'appel à next()
dans le gestionnaire du milieu comme ceci:
app.get('/user/:id', function (req, res, next) {
console.log('handling request');
res.sendStatus(200);
//next();
});
Vous verrez ceci sur la console:
before request handler
handling request
Notez que le dernier gestionnaire (celui qui imprime after request handler
) ne s'exécute pas. C'est parce que vous ne dites plus à express d'exécuter le prochain gestionnaire.
Donc, peu importe si votre gestionnaire "principal" (celui qui renvoie 200) a réussi ou non, si vous voulez que le reste des middlewares s'exécute, vous devez appeler next()
.
Quand cela serait-il utile? Supposons que vous souhaitiez enregistrer toutes les demandes qui sont arrivées dans une base de données, que la demande ait réussi ou non.
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();
});
Si vous voulez que le deuxième gestionnaire s'exécute, vous devez appeler next()
le premier gestionnaire.
Rappelez-vous que le nœud est asynchrone, il ne peut donc pas savoir quand le rappel du premier gestionnaire est terminé. Vous devez le dire en appelant next()
.