Czy istnieje użyteczna różnica między app.all('*', ... )
i app.use('/', ...)
w Node.JS Express?
121
W większości przypadków działałyby równoważnie. Największą różnicą jest kolejność, w jakiej zostanie zastosowane oprogramowanie pośredniczące:
app.all()
przyłącza się do routera aplikacji, więc jest używane za każdym razem, gdy zostanie osiągnięte oprogramowanie pośredniczące app.router (które obsługuje wszystkie trasy metod ... GET, POST itp.).UWAGA: app.router stał się przestarzały w express 4.x
app.use()
dołącza się do głównego stosu oprogramowania pośredniego aplikacji, więc jest używany w kolejności określonej przez oprogramowanie pośredniczące. np. jeśli umieścisz go jako pierwszy, będzie to pierwsza rzecz do uruchomienia. Jeśli umieścisz go na końcu (za routerem), zwykle w ogóle nie będzie działać.Zwykle, jeśli chcesz zrobić coś globalnie dla wszystkich tras, lepszym rozwiązaniem jest app.use (). Ponadto ma mniejsze szanse na przyszłe błędy, ponieważ express 0.4 prawdopodobnie porzuci niejawny router (co oznacza, że pozycja routera w oprogramowaniu pośrednim będzie ważniejsza niż teraz, ponieważ technicznie nie musisz go nawet używać teraz).
next("route")
withapp.all
, ale nie withapp.use
.app.use przyjmuje tylko jedną funkcję zwrotną i jest przeznaczona dla oprogramowania pośredniczącego. Oprogramowanie pośredniczące zwykle nie obsługuje żądań i odpowiedzi (technicznie jest to możliwe), po prostu przetwarza dane wejściowe i przekazuje je do następnego programu obsługi w kolejce.
app.all przyjmuje wiele wywołań zwrotnych i jest przeznaczony do routingu. dzięki wielu callbackom możesz filtrować zapytania i wysyłać odpowiedzi. Jest to wyjaśnione w sekcji Filtry na express.js
app.use widzi tylko, czy adres URL zaczyna się od określonej ścieżki
app.all dopasuje pełną ścieżkę
źródło
app.use:
app.all:
Spójrz na ten przykład kodu expressJs:
Oto dziennik uzyskiwania dostępu do trasy „/ hello”:
źródło
W
app.use()
przypadku ścieżki „montowania” jest usuwana i nie jest widoczna dla funkcji oprogramowania pośredniego:Zamontowane funkcje oprogramowania pośredniego (
express.static
) nie są wywoływane, chyba że elementreq.url
zawiera ten prefiks (/static
), w którym to momencie jest usuwany, gdy funkcja jest wywoływana.Dzięki
app.all()
, że nie ma to zachowanie.źródło
Tak,
app.all()
jest wywoływana, gdy żądany jest określony identyfikator URI za pomocą dowolnego typu metody żądania (POST, GET, PUT lub DELETE)Z drugiej strony
app.use()
jest używany dla dowolnego oprogramowania pośredniego, które możesz mieć, i jest montowany na prefiksie ścieżki i będzie wywoływany za każdym razem, gdy zażąda się identyfikatora URI w ramach tej trasy.Oto dokumentacja dotycząca app.all i app.use .
źródło
Dwie różnice we wszystkich powyższych odpowiedziach nie są spełnione.
Pierwsza:
app.all
akceptuje wyrażenie regularne jako parametr ścieżki.app.use
NIE akceptuje wyrażenia regularnego.Drugi:
app.all(path,handler)
lubapp[method](path,handler)
, przewodnikpath
musi być taki sam dla wszystkichpath
. Oznacza to, że ścieżka aplikacji [metoda] ”jest kompletna.app.use(path,hanlder)
, jeśli ścieżka użycia jest kompletna, ścieżka hanldera musi mieć postać „/”. jeśli ścieżka użycia jest początkiem pełnej ścieżki, ścieżka obsługi musi być resztą całej ścieżki.źródło
Istnieją dwie główne różnice:
1. dopasowanie wzorców (odpowiedź udzielona przez Palaniego)
2.
next(route)
nie będzie działać wewnątrz treści funkcji oprogramowania pośredniego załadowanego za pomocąapp.use
. Jest to określone w linku z dokumentów:Link: http://expressjs.com/en/guide/using-middleware.html
Efekt pracy
next('route')
można zobaczyć na poniższym przykładzie:źródło