Czy istnieje przydatna różnica między app.all('*', ...)
i app.use('/', ...)
w Node.JS Express?Różnica między app.all ("*") i app.use ("/")
Odpowiedz
W większości przypadków będą działać równorzędnie. Największą różnicą jest kolejność, w jakiej middleware będzie stosowana:
app.all()
przywiązuje do routera aplikacji, więc jest on wykorzystywany, gdy zostanie osiągnięta middleware app.router (który obsługuje wszystkie trasy ... metoda GET, POST, itp.).app.use()
dołącza do głównego stosu oprogramowania pośredniego aplikacji, więc jest używany w kolejności określonej przez oprogramowanie pośrednie. np. jeśli umieścisz to jako pierwsze, będzie to pierwsza rzecz. Jeśli umieścisz go jako ostatni (po routerze), zwykle nie będzie on w ogóle uruchamiany.
Zwykle, jeśli chcesz zrobić coś globalnie na wszystkich trasach, lepszym rozwiązaniem będzie app.use(). Ponadto ma mniejsze szanse na przyszłe błędy, ponieważ ekspresowy 0.4 prawdopodobnie opuści niejawny router (co oznacza, że pozycja routera w oprogramowaniu pośredniczącym będzie ważniejsza niż teraz, ponieważ technicznie nawet nie musisz go używać teraz).
Tak, app.all()
jest wywoływana gdy dany URI jest wymagany w przypadku każdego rodzaju metody żądania (POST, GET, PUT lub DELETE)
Z drugiej strony app.use()
wykorzystywane do pośredniej może mieć i to wierzchowiec na prefiks ścieżki i będzie wywoływany za każdym razem, gdy żądany jest URI pod tą trasą. To jest dokumentacja dla app.all & app.use.
dziękuję, ale myślę, że tęskniłeś za ścieżką główną app.use wildcard i app.use, które sprawiają, że prawie dokładnie to samo, prawda? Tyle tylko, że app.all może przyjmować szereg wywołań zwrotnych, a app.use może je przyjąć tylko jeden - prawda? – ostergaard
Z app.use()
, w "mount" ścieżka jest usuwane i nie są widoczne dla funkcji middleware:
app.use('/static', express.static(__dirname + '/public'));
zawieszane funkcje middleware (express.static
) niewywoływanych ile req.url
zawiera ten prefiks (/static
) w tym momencie jest on usuwany, gdy funkcja jest wywoływana.
Z app.all()
, nie ma takiego zachowania.
Pytanie wprost pytać o app.use ("/", ...). – ostergaard
app.use:
- inject middlware do przodu kontrolera konfiguracyjnym na przykład: nagłówek, ciasteczka, sesje itd
- musi być napisana przed aplikacją [http_method] w przeciwnym razie nie będzie nie wykonany.
- kilka połączeń są przetwarzane w celu pisania
app.all:
- (jak aplikacji [http_method]) stosuje się do sterowników KONFIGURACJA połączeniach
- "wszystkie" oznacza dotyczy wszystkich metod http.
- kilka połączeń są przetwarzane w celu pisania
Spójrz na ten kod expressJs próbki:
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);
Oto log podczas uzyskiwania dostępu do trasy '/ 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
Po uruchomieniu tego przykładu dosłownego w wyrażeniu 4.x, w rzeczywistości uruchamia wszystkie 5 w kolejności. Jest to prawdopodobnie spowodowane zmianami w ekspresie w ciągu prawie 3 lat, od kiedy to zostało napisane, ale pomyślałem, że dodam to dla jasności. –
app.use zajmuje tylko jedno połączenie zwrotne nction i jest przeznaczona dla Middleware. Oprogramowanie pośredniczące zwykle nie obsługuje żądań i odpowiedzi (technicznie mogą) przetwarzają dane wejściowe i przekazują je następnemu handlerowi w kolejce.
app.use([path], function)
app.all wykonuje wiele wywołań zwrotnych, a przeznaczona do frezowania. z wieloma callbackami możesz filtrować żądania i wysyłać odpowiedzi. Jego wyjaśnione Filters on express.js
app.all(path, [callback...], callback)
app.use widzi tylko to, czy adres URL zaczyna się od określonej ścieżce
app.use("/product" , mymiddleware);
// will match /product
// will match /product/cool
// will match /product/foo
app.all dopasuje pełną ścieżkę
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
Przynajmniej w [v4, app.use] (http://expressjs.com/4x/api.html#app.use) ma jedną * lub więcej * funkcji oprogramowania pośredniego, a nie "tylko jedną". –
To powinna być odpowiedź !!! – frogcjn
app.use tylko zobacz, czy adres URL zaczyna się od określonej ścieżki, app.all będzie pasować do pełnej ścieżki. to główna różnica. – meizilp
- 1. Jaka jest różnica między app.all i app.use?
- 2. ekspresowe middleware: app.use i app.all
- 3. Różnica między app.use a app.get w pliku express.js
- 4. Różnica między unwrapObservable i()
- 5. Różnica między "**/* /" i "** /"?
- 6. Różnica między | = i^= css
- 7. Composer.phar różnica między | i ||
- 8. Różnica między "% ~ dp0" i ". \"?
- 9. Różnica między ". +" I ". +?"
- 10. MySQL: Różnica między ",", "i"
- 11. Różnica między (++ i) oraz (i ++)
- 12. Różnica kręgosłupa Różnica między CompositeView i CollectionView?
- 13. Różnica między logger.info i logger.debug
- 14. Różnica między fgets i fscanf?
- 15. Różnica między NSLog i DLog
- 16. Różnica między RoutedEventHandler i EventHandler
- 17. Różnica między obrysem i wypełnieniem?
- 18. Różnica między Parameters.Add i Parameters.AddWithValue
- 19. Różnica między putback() i unget()
- 20. Różnica między Delegate.BeginInvoke i Thread.Start
- 21. Różnica między TVar i TMVar
- 22. Różnica między DatagramSocket i DatagramChannel
- 23. Różnica między intent.setClass() i intent.setComponent()
- 24. różnica między -lgcc_s i gcc
- 25. Różnica między string.ToLower i TextInfo.ToLower
- 26. Różnica między javax.sql i java.sql?
- 27. Różnica między paint() i paintcomponent()?
- 28. Różnica między c() i append()
- 29. Różnica między KeyEventArgs.systemKey i KeyEventArgs.Key
- 30. Różnica między org.apache.spark.ml.classification i org.apache.spark.mllib.classification
robi to nadal stosować po Express 4.x? app.router został usunięty. – ruffrey
ładnie wyjaśnione. – user2045474
Możesz użyć 'next (" route ")' z 'app.all', ale nie z' app.use'. –