Y a-t-il une différence utile entre app.all("*", … )
y app.use("/", … )
dans Express.js fonctionnant sur Node.js ?
Réponses
Trop de publicités?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'applicationapp.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).
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
-
app.use :
- Injectez du middlware à votre contrôleur frontal en configurant par exemple : l'en-tête, les cookies, les sessions, etc.
- doit être écrit avant app[http_method] sinon il ne sera pas exécuté.
- plusieurs appels sont traités dans l'ordre d'écriture
-
app.all :
- (comme app[http_method]) est utilisé pour configurer les contrôleurs des routes
- "all" signifie qu'il s'applique à toutes les méthodes http.
- 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
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.
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é.
- Réponses précédentes
- Plus de réponses