Węzeł.js / Express.js-jak działa aplikacja.router działa?

Zanim zapytam o app.router myślę, że powinienem przynajmniej wyjaśnić, co moim zdaniem dzieje się podczas pracy z middleware. Aby użyć middleware, należy użyć funkcji app.use(). Gdy oprogramowanie middleware jest wykonywane, albo wywoła następne oprogramowanie middleware za pomocą next(), albo sprawi, że nie będzie już wywoływane. Oznacza to, że kolejność, w jakiej umieszczam moje wywołania middleware jest ważna, ponieważ niektóre middleware zależą od innych middleware, a niektóre middleware na końcu mogą nawet nie być dzwoniłem.

Dzisiaj pracowałem nad moją aplikacją i miałem serwer uruchomiony w tle. Chciałem wprowadzić kilka zmian i odświeżyć stronę i natychmiast zobaczyć zmiany. W szczególności dokonywałem zmian w moim układzie. Nie mogłem go uruchomić, więc przeszukałem Stack Overflow w poszukiwaniu odpowiedzi i znalazłem to pytanie. Mówi, aby upewnić się, że express.static() jest poniżej require('stylus'). Ale kiedy patrzyłem na kod tej operacji, zobaczyłem, że ma swój telefon na samym końcu jego middleware dzwoni, i próbowałem dowiedzieć się, dlaczego tak jest.

Kiedy zrobiłem mój ekspres.aplikacji js (Wersja 3.0. 0rc4), użyłem komendy express app --sessions --css stylus i w mojej aplikacji.plik js kod przyszedł z moim app.router powyżej obu wywołań express.static() i require('stylus'). Więc wygląda na to, że jeśli jest już ustawiony w ten sposób, to powinien tak pozostać.

Po przeorganizowaniu mojego kodu, abym mógł zobaczyć moje zmiany rysika, 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');
});

Więc postanowiłem, że pierwszym krokiem będzie znalezienie dlaczego ważne jest, aby mieć app.router w moim kodzie. Więc skomentowałem to, uruchomiłem aplikację i nawigowałem do /. Wyświetlił moją stronę indeksu w porządku. Hmm, może zadziałało, ponieważ eksportowałem routing z mojego pliku routes (routes.indeks). Następnie nawigowałem do /test i wyświetliło się 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, mój routing jest w porządku. Więc zdecydowanie czegoś mi brakuje.

Oto Mój Pytanie:

Czy ktoś mógłby wyjaśnić, co robi, znaczenie tego i gdzie powinienem umieścić to w moich wywołaniach middleware? Byłoby też miło, gdybym otrzymał krótkie wyjaśnienie na temat express.static(). O ile wiem, {[4] } jest buforem moich informacji, a jeśli aplikacja nie może znaleźć żądanej strony, sprawdzi bufor, aby sprawdzić, czy istnieje.
Author: Community, 2012-10-02

3 answers

Uwaga: opisuje to, jak Express działał w wersjach 2 i 3. Zobacz koniec tego postu, aby uzyskać informacje o Express 4.


static po prostu serwuje pliki (static resources) z dysku. Podajesz mu ścieżkę (czasami zwaną punktem montowania) i służy do obsługi plików w tym folderze.

Na przykład, express.static('/var/www') będzie obsługiwać pliki w tym folderze. Tak więc prośba do serwera węzła dla http://server/file.html służyłaby /var/www/file.html.

router to kod, który uruchamia Twoje trasy. Kiedy robisz app.get('/user', function(req, res) { ... });, to router faktycznie wywołuje funkcję zwrotną, aby przetworzyć żądanie.

Kolejność przekazania rzeczy app.use określa kolejność, w jakiej każdy middleware ma możliwość przetworzenia żądania. Na przykład, jeśli Masz plik o nazwie test.html w folderze statycznym i trasę:

app.get('/test.html', function(req, res) {
    res.send('Hello from route handler');
});

Który zostanie wysłany do klienta z prośbą http://server/test.html? Niezależnie od tego, które oprogramowanie pośrednie zostanie podane use jako pierwsze.

Jeśli to:

app.use(express.static(__dirname + '/public'));
app.use(app.router);

Następnie plik na dysku jest obsługiwany.

Jeśli zrobisz to w drugą stronę,

app.use(app.router);
app.use(express.static(__dirname + '/public'));

Następnie route handler pobiera żądanie, a "Hello from route handler"zostaje wysłane do przeglądarki.

Zazwyczaj chcesz umieścić router powyżej statycznej warstwy pośredniej, aby przypadkowo nazwany plik nie mógł nadpisać jednej z Twoich tras.

Zauważ, że jeśli nie masz jawnie use router, jest ona domyślnie dodawana przez Express w punkcie, który zdefiniujesz trasa (dlatego Twoje trasy nadal działały, mimo że skomentowałeś app.use(app.router)).


Komentator maporuszył kolejny punkt o kolejności static i router, które nie zostały poruszone: wpływ na ogólną wydajność aplikacji.

Kolejny powód do use router powyżej {[5] } jest optymalizacja wydajności. Jeśli najpierw umieścisz static, przy każdym pojedynczym żądaniu trafisz na dysk twardy, aby sprawdzić, czy plik istnieje. W szybkim teście , I okazało się, że narzut wynosił ~1ms na nieobciążonym serwerze. (Liczba ta prawdopodobnie będzie wyższa pod obciążeniem, gdzie żądania będą konkurować o dostęp do dysku.)

Z router Po pierwsze, żądanie pasujące do trasy nigdy nie musi trafić na dysk, oszczędzając cenne milisekundy.

Oczywiście, istnieją sposoby na złagodzenie kosztów.

Najlepszą opcją jest umieszczenie wszystkich zasobów statycznych w określonym folderze. (IE /static) można następnie zamontować static do tej ścieżki, aby że działa tylko wtedy, gdy ścieżka zaczyna się od /static:

app.use('/static', express.static(__dirname + '/static'));

W tej sytuacji umieściłbyś to powyżej router. Pozwala to uniknąć przetwarzania innego oprogramowania pośredniczącego / routera, Jeśli plik jest obecny, ale szczerze mówiąc, wątpię, że tyle zyskasz.

Możesz również użyć staticCache, które buforuje statyczne zasoby w pamięci, dzięki czemu nie musisz trafiać na dysk dla często żądanych plików. (Ostrzeżenie: staticCache zostaną usunięte w przyszłość.)

Nie wydaje mi się jednak, aby staticCache buforowała negatywne odpowiedzi (gdy plik nie istnieje), więc nie pomaga umieszczenie staticCache powyżej router bez zamontowania go na ścieżce.

Podobnie jak w przypadku wszystkich pytań dotyczących wydajności, Zmierz i porównaj swoją aplikację w świecie rzeczywistym (pod obciążeniem), aby zobaczyć, gdzie naprawdę są wąskie gardła.


Express 4

Express 4.0 usuwa app.router. Wszystkie middleware (app.use) i routes (app.get et al) są teraz przetwarzane w dokładnie takiej kolejności, w jakiej są dodawane.

Innymi słowy:

Wszystkie metody routingu zostaną dodane w kolejności, w jakiej się pojawią. Powinieneś Nie robić app.use(app.router). Eliminuje to najczęstszy problem z Express.

Innymi słowy, mieszanie app.use() i app[VERB]() będzie działać dokładnie w kolejności, w jakiej są wywoływane.

app.get('/', home);
app.use('/public', require('st')(process.cwd()));
app.get('/users', users.list);
app.post('/users', users.create);

Przeczytaj więcej o zmianach w Express 4.

 326
Author: josh3736,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:06

Routing oznacza określenie, w jaki sposób aplikacja reaguje na żądanie klienta do określonego punktu końcowego, którym jest URI (lub ścieżka) i określona metoda żądania HTTP (GET, POST itd.). Każda trasa może mieć jedną lub więcej funkcji obsługi, które są wykonywane po dopasowaniu trasy.

W routerze Express 4.0 zapewniamy większą elastyczność niż kiedykolwiek wcześniej w definiowaniu naszych tras.

Express.Router () jest używany wielokrotnie do definiowania grup tras.

Route używany jako oprogramowanie pośredniczące do przetwarzania żądań.

Route używany jako middleware do walidacji parametrów za pomocą ".param ()"

App.route() używany jako skrót do routera do definiowania wielu żądań na trasie

Kiedy korzystamy z aplikacji.route (), dołączamy naszą aplikację do tego routera.

var express = require('express'); //used as middleware
var app = express(); //instance of express.
app.use(app.router);
app.use(express.static(__dirname + '/public')); //All Static like [css,js,images] files are coming from public folder
app.set('views',__dirname + '/views'); //To set Views
app.set('view engine', 'ejs'); //sets View-Engine as ejs
app.engine('html', require('ejs').renderFile); //actually rendering HTML files through EJS. 
app.get('/', function (req, res) {
  res.render('index');  
})
app.get('/test', function (req, res) {
  res.send('test')
})
 2
Author: Parth Raval,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 17:21:17

W wersji express 4 możemy łatwo zdefiniować trasy w następujący sposób:

Serwer.js:

const express = require('express');
const app = express();
const route = require('./route');

app.use('/route', route);
// here we pass in the imported route object

app.listen(3000, () => console.log('Example app listening on port 3000!'));

Trasa.js:

const express = require('express');
const router = express.Router();

router.get('/specialRoute', function (req, res, next) {
     // route is now http://localhost:3000/route/specialRoute
});

router.get('/', function (req, res, next) {
    // route is now http://localhost:3000/route
});

module.exports = router;

W server.js zaimportowaliśmy obiekt routera pliku route.js i zastosowaliśmy go w następujący sposób w server.js:

app.use('/route', route);

Teraz wszystkie trasy w route.js mają następujący bazowy URL:

Http://localhost:3000/route

Dlaczego takie podejście:

Główną zaletą tego podejście jest takie, że teraz nasza aplikacja jest bardziej modułowa. Wszystkie procedury obsługi trasy dla danej trasy można teraz umieścić w różnych plikach, co sprawia, że wszystko jest łatwiejsze do utrzymania i łatwiejsze do znalezienia.

 0
Author: Willem van der Veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-12 07:54:21