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

Existe-t-il une différence utile entre app.all('*', ... ) et app.use('/', ...) dans Node.JS Express?

Dans la plupart des cas, ils travailleraient de manière équivalente. La plus grande différence est l’ordre dans lequel les intergiciels seront appliqués:

  • app.all() se app.all() au routeur de l’application, il est donc utilisé chaque fois que le middleware app.router est atteint (qui gère toutes les routes de méthode … GET, POST, etc.).

  • app.use() se app.use() à la stack logicielle principale de l’application, elle est donc utilisée dans l’ordre spécifié par le middleware. Par exemple, si vous le mettez en premier, ce sera la première chose à faire. Si vous le mettez en dernier, (après le routeur), il ne sera généralement pas exécuté.

Généralement, si vous voulez faire quelque chose globalement à toutes les routes, app.use () est la meilleure option. En outre, il y a moins de risque de bogues à venir, puisque Express 0.4 laissera probablement tomber le routeur implicite (ce qui signifie que la position du routeur dans le middleware sera plus importante qu’il ne l’est actuellement, puisque vous n’avez même pas besoin de l’utiliser) maintenant).

app.use ne prend qu’une fonction de rappel et est destinée au middleware. Le middleware ne gère généralement pas les requêtes et les réponses (ils peuvent techniquement le faire), ils traitent uniquement les données d’entrée et les transmettent au gestionnaire suivant dans la queue.

 app.use([path], function) 

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

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

app.use ne voit que 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 

Avec app.use() , le chemin “mount” est supprimé et n’est pas visible par la fonction middleware:

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

Les fonctions de middleware montées ( express.static ) ne sont appelées que si le req.url contient ce préfixe ( /static ), auquel cas il est supprimé lorsque la fonction est appelée.

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

  • app.use:

    1. injecter middlware dans la configuration de votre contrôleur frontal, par exemple: en-tête, cookies, sessions, etc.
    2. doit être écrit avant l’application [http_method] sinon il n’y aura pas d’exécution.
    3. plusieurs appels sont traités dans l’ordre d’écriture
  • épouvanter:

    1. (comme app [http_method]) est utilisé pour configurer les contrôleurs de 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’access à 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 

Oui, app.all() est appelée lorsqu’un URI particulier est demandé avec tout type de méthode de requête (POST, GET, PUT ou DELETE)

D’un autre côté, app.use() est utilisé pour tout middleware que vous pourriez avoir et qu’il 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 .