259 votes

Différence entre app.use et app.get dans express.js

Je suis assez novice en matière d'express et de node.js, et je n'arrive pas à comprendre la différence entre app.use et app.get. Il semble que vous pouvez utiliser les deux pour envoyer des informations. Par exemple :

app.use('/',function(req, res,next) {
    res.send('Hello');
    next();
});

semble être le même que celui-là :

app.get('/', function (req,res) {
   res.send('Hello');
});

7voto

Atilla Baspinar Points 41

En plus des explications ci-dessus, ce que je vis :

app.use('/book', handler);  

correspondra à toutes les demandes à partir de '/book' comme URL. Il correspond donc aussi à '/book/1' ou '/book/2'.

app.get('/book')  

ne correspond qu'aux requêtes GET avec correspondance exacte . Il ne traitera pas les URLs comme '/book/1' ou '/book/2'.

Donc, si vous voulez un gestionnaire global qui gère toutes vos routes, alors app.use('/') est l'option. app.get('/') ne traitera que l'URL racine.

2voto

S.Nakib Points 51

Il y a 3 différences principales que j'ai trouvées jusqu'à présent. La troisième n'est pas si évidente et vous la trouverez peut-être intéressante. Les différences sont les mêmes pour l'express router . Cela signifie router.use() y router.get() ou autre post , put , all etc. ont également la même différence.

1

  • app.use(path, callback) répondra à toute requête HTTP.
  • app.get(path, callback) ne répondra qu'aux GET Demande HTTP. De la même manière, post , put etc. répondront à leur demande correspondante. app.all() répond à toute demande HTTP de manière app.use() y app.all() sont les mêmes dans cette partie.

2

  • app.use(path, callback) correspondra au préfixe du chemin de la demande et répondra si un préfixe du chemin de la demande correspond au paramètre du chemin. Par exemple, si le paramètre du chemin est "/" alors il correspondra à "/" , "/about" , "/users/123" etc.
  • app.get(path, callback) Ici, get correspondra à l'ensemble du chemin. Idem pour les autres requêtes HTTP et app.all() . Par exemple, si le paramètre du chemin est "/" alors il ne correspondra qu'à "/" .

3

next('route') n'a pas de travailler sur les fonctions d'intergiciel/de rappel de l'entreprise. app.use() . Il ne fonctionne que sur app.get() , app.all() et d'autres fonctions similaires d'autres demandes HTTP.

Selon documentation expresse :

next('route') ne fonctionnera que dans les fonctions middleware qui ont été chargées en utilisant les fonctions app.METHOD() ou router.METHOD().

METHOD est la méthode HTTP de la requête que la fonction middleware traite (comme GET, PUT ou POST) en minuscules.

À partir de maintenant, nous utiliserons le mot-clé METHOD au lieu de get , post , all etc.
Mais qu'est-ce que next('route') ? !

Voyons voir.

next('route')

nous voyons, app.use() o app.METHOD() peut prendre plusieurs fonctions de rappel/middleware.

De la documentation expresse :

Les fonctions d'intergiciel sont des fonctions qui ont accès à l'objet de requête (req), à l'objet de réponse (res) et à la fonction d'intergiciel suivante dans le cycle requête-réponse de l'application. La fonction intermédiaire suivante est généralement désignée par une variable nommée next.

Si la fonction middleware actuelle ne termine pas le cycle demande-réponse, elle doit appeler next() pour passer le contrôle à la fonction middleware suivante. Sinon, la demande sera laissée en suspens.

Nous voyons donc que chaque fonction middleware doit soit appeler la fonction middleware suivante, soit terminer la réponse. Et c'est la même chose pour app.use() y app.METHOD() .

Mais parfois, dans certaines conditions, vous pouvez vouloir sauter toutes les fonctions de rappel suivantes pour la route actuelle, mais vous ne voulez pas non plus terminer la réponse maintenant. Parce qu'il y a peut-être d'autres itinéraires à faire correspondre. Donc, pour sauter toutes les fonctions de rappel de l'itinéraire actuel sans terminer la réponse, vous pouvez exécuter next('route') . Il sautera toutes les fonctions de rappel de la route actuelle et cherchera à correspondre aux routes suivantes.

Par exemple (Extrait de la documentation express ):

app.get('/user/:id', function (req, res, next) {
  // if the user ID is 0, skip to the next route
  if (req.params.id === '0') next('route')
  // otherwise pass the control to the next middleware function in this stack
  else next()
}, function (req, res, next) {
  // send a regular response
  res.send('regular')
})

// handler for the /user/:id path, which sends a special response
app.get('/user/:id', function (req, res, next) {
  res.send('special')
})

Tu vois, ici, dans une certaine condition (req.params.id === '0') nous voulons sauter la fonction de rappel suivante, mais nous ne voulons pas non plus terminer la réponse parce qu'il y a une autre route avec le même paramètre de chemin qui va correspondre et cette route va envoyer une réponse spéciale. (Oui, il est valide d'utiliser le même paramètre de chemin pour la même METHOD plusieurs fois. Dans de tels cas, toutes les routes seront appariées jusqu'à la fin de la réponse). Donc, dans de tels cas, nous exécutons la commande next('route') et toutes les fonctions de rappel de l'itinéraire actuel sont ignorées. Ici, si la condition n'est pas remplie, nous appelons la fonction de rappel suivante.

Este next('route') n'est possible que dans le app.METHOD() fonctions.

Rappelant de documentation expresse :

next('route') ne fonctionnera que dans les fonctions middleware qui ont été chargées en utilisant les fonctions app.METHOD() ou router.METHOD().

Puisque sauter toutes les fonctions de rappel de l'itinéraire actuel est pas possible dans app.use() nous devrions être prudents ici. Nous ne devons utiliser les fonctions de l'intergiciel que dans app.use() qui ne doit pas être sautée dans n'importe quelle condition. Comme nous devons soit terminer la réponse, soit parcourir toutes les fonctions de rappel du début à la fin, nous ne pouvons absolument pas les sauter.

Vous pouvez visiter ici pour plus d'informations

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