Gibt es einen nützlichen Unterschied zwischen app.all('*', ... )
und app.use('/', ...)
in Node.JS Express?
Gibt es einen nützlichen Unterschied zwischen app.all('*', ... )
und app.use('/', ...)
in Node.JS Express?
Antworten:
In den meisten Fällen würden sie gleichwertig arbeiten. Der größte Unterschied besteht in der Reihenfolge, in der die Middleware angewendet wird:
app.all()
Wird an den Router der Anwendung angehängt und wird daher immer dann verwendet, wenn die Middleware app.router erreicht wird (die alle Methodenrouten verarbeitet ... GET, POST usw.).HINWEIS: app.router ist in Express 4.x veraltet
app.use()
Wird an den Haupt-Middleware-Stack der Anwendung angehängt, sodass er in der von der Middleware angegebenen Reihenfolge verwendet wird. Wenn Sie es beispielsweise an die erste Stelle setzen, wird es als erstes ausgeführt. Wenn Sie es zuletzt (nach dem Router) setzen, wird es normalerweise überhaupt nicht ausgeführt.Wenn Sie global etwas mit allen Routen tun möchten, ist normalerweise app.use () die bessere Option. Außerdem besteht eine geringere Wahrscheinlichkeit für zukünftige Fehler, da Express 0.4 wahrscheinlich den impliziten Router fallen lässt (was bedeutet, dass die Position des Routers in der Middleware wichtiger ist als jetzt, da Sie ihn technisch nicht einmal verwenden müssen jetzt sofort).
next("route")
mit verwenden app.all
, aber nicht mit app.use
.
app.use verwendet nur eine Rückruffunktion und ist für Middleware gedacht. Middleware verarbeitet normalerweise keine Anforderungen und Antworten (technisch können sie dies), sondern verarbeitet nur Eingabedaten und übergibt sie an den nächsten Handler in der Warteschlange.
app.use([path], function)
app.all nimmt mehrere Rückrufe entgegen und ist für das Routing gedacht. Mit mehreren Rückrufen können Sie Anforderungen filtern und Antworten senden. Es wird in Filter auf express.js erklärt
app.all(path, [callback...], callback)
app.use sieht nur, ob die URL mit dem angegebenen Pfad beginnt
app.use( "/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.all entspricht dem vollständigen Pfad
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:
entsetzen:
Schauen Sie sich dieses ExpressJs-Codebeispiel an:
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);
Hier ist das Protokoll beim Zugriff auf die Route '/ hallo':
(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
Mit app.use()
wird der "Mount" -Pfad entfernt und ist für die Middleware-Funktion nicht sichtbar:
app.use('/static', express.static(__dirname + '/public'));
Bereitgestellte Middleware-Funktionen ( express.static
) werden nur aufgerufen, wenn sie req.url
dieses Präfix ( /static
) enthalten. An diesem Punkt wird es beim Aufrufen der Funktion entfernt.
Mit app.all()
gibt es kein solches Verhalten.
Ja, app.all()
wird aufgerufen, wenn ein bestimmter URI mit einer beliebigen Anforderungsmethode (POST, GET, PUT oder DELETE) angefordert wird.
Andererseits app.use()
wird es für jede Middleware verwendet, die Sie möglicherweise haben, und es wird auf ein Pfadpräfix gemountet und wird jedes Mal aufgerufen, wenn eine URI unter dieser Route angefordert wird.
Zwei Unterschiede, die alle oben genannten Antworten nicht erfüllen.
Der erste: app.all
akzeptiert einen regulären Ausdruck als Pfadparameter . app.use
akzeptiert KEINE Regex.
Der zweite:
app.all(path,handler)
oder app[method](path,handler)
, der Handler path
muss für alle gleich sein path
. Dies bedeutet, dass der Pfad von app [method] vollständig ist.
app.use(path,hanlder)
Wenn der Pfad der Verwendung vollständig ist, muss der Pfad des Handers '/' sein. Wenn der Pfad der Verwendung der Anfang des vollständigen Pfads ist, muss der Handlerpfad der Rest des vollständigen Pfads sein.
app.use('/users', users);
//users.js: the handler will be called when matchs `/user/` path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
// others.js: the handler will be called when matchs `/users/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
app.all('/users', users);
//others.js: the handler wil be called when matchs `/`path
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
//users.js: the handler will be called when matchs `/users` path
router.get('/users', function(req, res, next) {
res.send('respond with a resource');
});
Es gibt zwei Hauptunterschiede:
1. Mustervergleich (Antwort von Palani)
2. next(route)
Funktioniert nicht im Funktionskörper der mit geladenen Middleware app.use
. Dies wird im Link aus den Dokumenten angegeben:
NOTE: next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.
Link: http://expressjs.com/en/guide/using-middleware.html
Der Arbeitseffekt von next('route')
ist aus dem folgenden Beispiel ersichtlich:
app.get('/',
(req,res,next)=>{console.log("1");
next(route); //The code here skips ALL the following middlewares
}
(req,res,next)=>{next();}, //skipped
(req,res,next)=>{next();} //skipped
);
//Not skipped
app.get('/',function(req,res,next){console.log("2");next();});