Zanim zapytam o app.router
, myślę, że powinienem przynajmniej wyjaśnić, co myślę, co dzieje się podczas pracy z oprogramowaniem pośrednim. Aby użyć oprogramowania pośredniego, należy użyć tej funkcji app.use()
. Podczas wykonywania oprogramowania pośredniego wywoła następne oprogramowanie pośrednie za pomocą next()
lub sprawi, że nie będzie już wywoływane. Oznacza to, że kolejność, w jakiej umieszczam wywołania oprogramowania pośredniego, jest ważna, ponieważ niektóre oprogramowanie pośrednie zależy od innego oprogramowania pośredniego, a niektóre oprogramowanie pośrednie pod koniec może nawet nie zostać wywołane.
Dzisiaj pracowałem nad aplikacją i mój serwer działał w tle. Chciałem wprowadzić pewne zmiany, odświeżyć stronę i od razu je zobaczyć. W szczególności wprowadzałem zmiany w moim układzie. Nie mogłem go uruchomić, więc szukałem odpowiedzi na Przepełnienie stosu i znalazłem to pytanie . Mówi, aby upewnić się, że express.static()
jest poniżej require('stylus')
. Ale kiedy patrzyłem na kod tego OP, zobaczyłem, że miał swoje app.router
połączenie na samym końcu swoich wywołań oprogramowania pośredniego i próbowałem dowiedzieć się, dlaczego tak się dzieje.
Kiedy utworzyłem aplikację Express.js (wersja 3.0.0rc4), użyłem polecenia, express app --sessions --css stylus
aw moim pliku app.js kod został dostarczony wraz z moimi app.router
powyższymi wywołaniami express.static()
i require('stylus')
. Wygląda więc na to, że jeśli tak już jest, to tak powinno pozostać.
Po zmianie aranżacji kodu, aby zobaczyć zmiany w rysiku, wygląda to tak:
app.configure(function(){
//app.set() calls
//app.use() calls
//...
app.use(app.router);
app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(__dirname + '/public', {maxAge: 31557600000}));
});
app.get('/', routes.index);
app.get('/test', function(req, res){
res.send('Test');
});
Zdecydowałem więc, że pierwszym krokiem będzie ustalenie, dlaczego tak ważne jest, aby mieć nawet app.router
mój kod. Skomentowałem to, uruchomiłem aplikację i nawigowałem do /
. Moja strona indeksu wyświetlała się dobrze. Hmm, może zadziałało, ponieważ eksportowałem routing z mojego pliku tras (route.index). Następnie nawigowałem /test
i wyświetliłem Test na ekranie. Haha, OK, nie mam pojęcia co app.router
robi. Niezależnie od tego, czy jest to zawarte w moim kodzie, czy nie, moje routing jest w porządku. Więc zdecydowanie czegoś mi brakuje.
Oto moje pytanie:
Czy ktoś mógłby wyjaśnić, co to app.router
znaczy, jak ważne jest to miejsce i gdzie powinienem to umieścić w wywołaniach oprogramowania pośredniego? Byłoby również miło, gdybym otrzymał krótkie wyjaśnienie na temat express.static()
. O ile mogę stwierdzić, express.static()
jest to pamięć podręczna moich informacji, a jeśli aplikacja nie może znaleźć żądanej strony, sprawdzi pamięć podręczną, aby sprawdzić, czy istnieje.
źródło
Odpowiedzi:
Uwaga: opisuje, jak Express działał w wersjach 2 i 3. Informacje na temat Express 4 można znaleźć na końcu tego postu.
static
po prostu podaje pliki ( zasoby statyczne ) z dysku. Dajesz mu ścieżkę (czasami nazywaną punktem montowania) i służy ona do plików w tym folderze.Na przykład
express.static('/var/www')
wyświetlałby pliki w tym folderze. Tak więc żądanie do twojego serwera Nodehttp://server/file.html
byłoby spełnione/var/www/file.html
.router
to kod, który obsługuje twoje trasy. Kiedy to zrobiszapp.get('/user', function(req, res) { ... });
, torouter
faktycznie wywołuje funkcję wywołania zwrotnego w celu przetworzenia żądania.Kolejność przekazywania rzeczy
app.use
określa kolejność, w jakiej każde oprogramowanie pośrednie ma możliwość przetworzenia żądania. Na przykład jeśli masz plik o nazwietest.html
w folderze statycznym i trasę:Który zostaje wysłany do klienta z prośbą
http://server/test.html
? Które oprogramowanie pośrednie zostanie podane jakouse
pierwsze.Jeśli to zrobisz:
Następnie plik na dysku jest obsługiwany.
Jeśli zrobisz to w inny sposób,
Następnie procedura obsługi trasy otrzymuje żądanie, a „Witaj z funkcji obsługi trasy” jest wysyłane do przeglądarki.
Zwykle chcesz umieścić router nad statycznym oprogramowaniem pośrednim, aby przypadkowo nazwany plik nie mógł przesłonić jednej z twoich tras.
Należy pamiętać, że jeśli nie jawnie , to jest domyślnie dodany przez Express, w momencie zdefiniowania trasy (dlatego wasze drogi nadal pracował, nawet jeśli wykomentowane ).
use
router
app.use(app.router)
Komentator podniósł kolejną kwestię dotyczącą kolejności
static
i dorouter
której nie odniosłem się: wpływ na ogólną wydajność Twojej aplikacji.Kolejnym powodem do
use
router
powyższegostatic
jest optymalizacja wydajności. Jeśli umieścisz nastatic
pierwszym miejscu, uderzysz w dysk twardy przy każdym pojedynczym żądaniu, aby sprawdzić, czy plik istnieje. W szybkim teście stwierdziłem, że narzut ten wyniósł ~ 1ms na nieobciążonym serwerze. (Liczba ta prawdopodobnie będzie wyższa pod obciążeniem, gdy żądania będą konkurować o dostęp do dysku).Po
router
pierwsze żądanie pasujące do trasy nigdy nie musi trafić na dysk, co oszczędza cenne milisekundy.Oczywiście istnieją sposoby na zmniejszenie
static
kosztów ogólnych.Najlepszą opcją jest umieszczenie wszystkich zasobów statycznych w określonym folderze. (IE
/static
) Następnie możesz zamontowaćstatic
na tej ścieżce, aby działała tylko wtedy, gdy ścieżka zaczyna się od/static
:W tej sytuacji postawisz to powyżej
router
. Pozwala to uniknąć przetwarzania innego oprogramowania pośredniego / routera, jeśli plik jest obecny, ale szczerze mówiąc, wątpię, czy zyskasz tyle.Możesz również użyć
staticCache
, który buforuje zasoby statyczne w pamięci, abyś nie musiał uderzać w dysk w poszukiwaniu często żądanych plików. ( Ostrzeżenie:staticCache
prawdopodobnie zostaną usunięte w przyszłości).Jednak nie sądzę, aby
staticCache
buforowało negatywne odpowiedzi (gdy plik nie istnieje), więc nie pomaga, jeśli umieściszstaticCache
powyżejrouter
bez zamontowania go na ścieżce.Podobnie jak w przypadku wszystkich pytań dotyczących wydajności, zmierz i testuj swoją rzeczywistą aplikację (pod obciążeniem), aby zobaczyć, gdzie naprawdę są wąskie gardła.
Ekspres 4
Express 4.0 usuwa
app.router
. Wszystkie oprogramowanie pośrednie (app.use
) i trasy (app.get
i in.) Są teraz przetwarzane w dokładnie takiej kolejności, w jakiej zostały dodane.Innymi słowy:
Przeczytaj więcej o zmianach w Express 4.
źródło
router
Idzie w jednym miejscu. Jeśli po raz pierwszy zadzwoniszapp.get
(lubpost
inne osoby), jeszcze nieuse
dapp.router
, Express doda to dla ciebie.static
POrouter
, pytanie o drugiej pośredniej staje się nieistotna, ponieważ musi być powyżej routera.app.router
jest usuwany w bieżącej gałęzi master, która będzie express-4.0 . Każda trasa staje się oddzielnym oprogramowaniem pośrednim.źródło
W ekspresowej wersji 4 możemy łatwo zdefiniować trasy w następujący sposób:
server.js:
route.js:
W
server.js
zaimportowaliśmy obiekt routeraroute.js
pliku i zastosowaliśmy go w następujący sposób wserver.js
:Teraz wszystkie trasy w
route.js
mają następujący podstawowy adres URL:http: // localhost: 3000 / route
Dlaczego takie podejście:
Główną zaletą takiego podejścia jest to, że teraz nasza aplikacja jest bardziej modułowa . Wszystkie moduły obsługi trasy dla określonej trasy można teraz umieścić w różnych plikach, co sprawia, że wszystko jest łatwiejsze w utrzymaniu i łatwiejsze do znalezienia.
źródło