2 votes

Que se passe-t-il si l'on surcharge la même route avec express js ?

J'aimerais savoir ce qui se passe si j'écris cela dans expressjs ( nous supposons que application est une application expressjs).

app.get.use('/here' , function(req, res) {
      // EXECUTE SET OF ACTION NUMBER 1
});

app.get.use('/here' , function(req, res) {
      // EXECUTE SET OF ACTION NUMBER 2
})

Nous écrivons deux fois le même itinéraire, mais avec des actions différentes. La deuxième déclaration surchargera-t-elle la première ?

6voto

rm- Points 4069

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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X