2013-01-02 20 views

Odpowiedz

87

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).

+10

robi to nadal stosować po Express 4.x? app.router został usunięty. – ruffrey

+0

ładnie wyjaśnione. – user2045474

+0

Możesz użyć 'next (" route ")' z 'app.all', ale nie z' app.use'. –

2

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.

+0

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

10

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.

+0

Pytanie wprost pytać o app.use ("/", ...). – ostergaard

10
  • app.use:

    1. inject middlware do przodu kontrolera konfiguracyjnym na przykład: nagłówek, ciasteczka, sesje itd
    2. musi być napisana przed aplikacją [http_method] w przeciwnym razie nie będzie nie wykonany.
    3. kilka połączeń są przetwarzane w celu pisania
  • app.all:

    1. (jak aplikacji [http_method]) stosuje się do sterowników KONFIGURACJA połączeniach
    2. "wszystkie" oznacza dotyczy wszystkich metod http.
    3. 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 
+3

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. –

47

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 
+9

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ą". –

+1

To powinna być odpowiedź !!! – frogcjn

+2

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