139 votes

Différence entre app.all('*') et app.use('/')

Y a-t-il une différence utile entre app.all("*", … ) y app.use("/", … ) dans Express.js fonctionnant sur Node.js ?

128voto

hunterloftis Points 2956

Dans la plupart des cas, ils fonctionnent de manière équivalente. La principale différence réside dans l'ordre dans lequel les intergiciels sont appliqués :

  • app.all() s'attache au routeur de l'application, de sorte qu'il est utilisé chaque fois que l'application app.router le middleware est atteint (qui gère toutes les routes de méthodes... GET , POST etc).

AVIS : app.router a été déprécié dans express 4.x

  • app.use() s'attache à la pile principale d'intergiciels de l'application, de sorte qu'il est utilisé dans l'ordre spécifié par l'intergiciel, par exemple, si vous le placez en premier, il sera la première chose à être exécutée. Si vous le placez en dernier (après le routeur), il ne sera généralement pas exécuté du tout.

Habituellement, si vous voulez faire quelque chose globalement à toutes les routes, app.use() est la meilleure option. De plus, il y a moins de risques de bogues futurs, puisque la version 0.4 d'Express abandonnera probablement le routeur implicite (ce qui signifie que la position du routeur dans l'intergiciel sera plus importante qu'elle ne l'est actuellement, puisque vous n'avez techniquement pas à l'utiliser).

108voto

Palani Points 2939

app.use ne prend qu'une seule fonction de rappel et il est destiné à l'intergiciel. Les intergiciels ne gèrent généralement pas les demandes et les réponses (techniquement, ils le peuvent), ils se contentent de traiter les données d'entrée et de les transmettre au gestionnaire suivant dans la file d'attente.

app.use([path], function)

app.all prend plusieurs callbacks, et est destiné au routage. Avec plusieurs callbacks, vous pouvez filtrer les demandes et envoyer des réponses. C'est expliqué dans Filtres sur express.js

app.all(path, [callback...], callback)

app.use voit seulement si l'url commence par le chemin spécifié

app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo

app.all correspondra au chemin complet

app.all( "/product" , handler);
// will match /product
// won't match /product/cool   <-- important
// won't match /product/foo    <-- important

app.all( "/product/*" , handler);
// won't match /product        <-- Important
// will match /product/
// will match /product/cool
// will match /product/foo

21voto

daemon1981 Points 56
  • app.use :

    1. Injectez du middlware à votre contrôleur frontal en configurant par exemple : l'en-tête, les cookies, les sessions, etc.
    2. doit être écrit avant app[http_method] sinon il ne sera pas exécuté.
    3. plusieurs appels sont traités dans l'ordre d'écriture
  • app.all :

    1. (comme app[http_method]) est utilisé pour configurer les contrôleurs des routes
    2. "all" signifie qu'il s'applique à toutes les méthodes http.
    3. plusieurs appels sont traités dans l'ordre d'écriture

Regardez cet exemple de code expressJs :

var express = require('express');
var app = express();

app.use(function frontControllerMiddlewareExecuted(req, res, next){
  console.log('(1) this frontControllerMiddlewareExecuted is executed');
  next();
});

app.all('*', function(req, res, next){
  console.log('(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next');
  next();
});

app.all('/hello', function(req, res, next){
  console.log('(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next');
  next();
});

app.use(function frontControllerMiddlewareNotExecuted(req, res, next){
  console.log('(4) this frontControllerMiddlewareNotExecuted is not executed');
  next();
});

app.get('/hello', function(req, res){
  console.log('(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response');
  res.send('Hello World');
});

app.listen(80);

Voici le journal lors de l'accès à la route '/hello' :

(1) this frontControllerMiddlewareExecuted is executed
(2) route middleware for all method and path pattern "*", executed first and can do stuff before going next
(3) route middleware for all method and path pattern "/hello", executed second and can do stuff before going next
(5) route middleware for method GET and path patter "/hello", executed last and I do my stuff sending response

13voto

better9 Points 46

Avec app.use() le chemin "mount" est supprimé et n'est pas visible pour la fonction middleware :

app.use('/static', express.static(__dirname + '/public'));

Fonctions middleware montées( express.static ) ne sont pas invoqués, sauf si l'option req.url contient ce préfixe ( /static ), à quel point il est dépouillé lorsque la fonction est invoquée.

Avec app.all() il n'y a pas ce comportement.

5voto

Gurpreet Singh Points 5982

Oui, app.all() est appelé lorsqu'un URI particulier est demandé avec n'importe quelle méthode de demande (POST, GET, PUT ou DELETE).

D'autre part app.use() est utilisé pour tout intergiciel que vous pourriez avoir et il se monte sur un préfixe de chemin, et sera appelé chaque fois qu'un URI sous cette route est demandé.

Voici la documentation pour app.all & app.use .

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