Cela dépend de ce qui se passe à l'intérieur de la fonction de rappel. Prenons trois exemples différents :
a)
const express = require('express');
const app = express();
app.get('/', (req, res, next) => {
console.log('1!');
res.json(true);
});
app.get('/', (req, res) => {
console.log('2!');
res.json(true);
});
app.listen(3000);
b)
const express = require('express');
const app = express();
app.get('/', (req, res, next) => {
console.log('1!');
});
app.get('/', (req, res) => {
console.log('2!');
res.json(true);
});
app.listen(3000);
c)
const express = require('express');
const app = express();
app.get('/', (req, res, next) => {
console.log('1!');
next();
});
app.get('/', (req, res) => {
console.log('2!');
res.json(true);
});
app.listen(3000);
Dans le cas (a), le flux de travail se fait de haut en bas. Le premier gestionnaire de route se met en marche, console.logs "1 !" et répond avec true
. Puisque la réponse complète a été envoyée, le gestionnaire de route suivant ne sera jamais atteint.
Dans le cas (b), l'exécution se bloque au niveau du premier gestionnaire de route. Il ne répond pas et ne permet pas à l'exécution d'aller plus loin. Si vous curl
cette application, vous obtiendrez un délai d'attente, même si vous verrez "1 !" sur la console.
Enfin, dans le cas (c), on peut voir next
appel de fonction. C'est ce qui permet à Express de poursuivre l'exécution et de passer au gestionnaire de route suivant, s'il y en a un. Puisqu'il y a un autre gestionnaire de route, il est exécuté, ce qui fait que vous vous retrouvez avec "1 !" et "2 !" imprimés sur la console, ainsi qu'avec la réponse envoyée correctement.
Quelques points ici :
- toujours appeler
next
si vous voulez qu'un autre gestionnaire de route s'exécute après celui en cours, et c'est particulièrement important lorsque vous écrivez un intergiciel ou, comme dans votre cas, une application de type intergiciel que vous allez éventuellement ajouter à une autre application,
- il est possible de construire une réponse dans plus d'un gestionnaire, par exemple, lorsque le premier déclare les en-têtes et/ou le corps, et que le suivant ajoute quelque chose aux en-têtes et/ou au corps (ce qui est bizarre et je vous déconseille fortement de le faire), et
- une fois la réponse envoyée, l'exécution s'arrête et aucun des autres gestionnaires de route ne peut être atteint (ce qui n'est pas garanti lorsque vous utilisez des blocs conditionnels, par exemple).