Różnice między express.Router a app.get?

265

Zaczynam od NodeJS i Express 4 i jestem trochę zdezorientowany. Czytałem witrynę Express, ale nie widzę, kiedy należy używać procedury obsługi trasy, ani kiedy express.Router.

Jak mogłem zobaczyć, jeśli chcę wyświetlić stronę lub coś, gdy użytkownik trafi /showna przykład, powinienem użyć:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

Na początku myślałem, że to stary (dla Express 3). Czy to prawda, czy tak też jest w przypadku Express 4?

Jeśli tak to robi w Expressie 4, do czego express.Routersłuży?

Czytam prawie taki sam przykład jak powyżej, ale używam express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

Jaka jest różnica między oboma przykładami?

Z którego powinienem skorzystać, jeśli chcę po prostu zrobić prostą stronę testową?

nelson687
źródło
27
A Routernie .listen()dotyczy wniosków samodzielnie. Przydaje się do rozdzielenia aplikacji na wiele modułów - tworzenia Routerw nich apppuszki require()i .use()jako oprogramowania pośredniego.
Jonathan Lonowski
5
Jak sugerował @JonathanLonowski, app.get(..)składnia jest tylko skrótem, który ułatwia pracę z nim express.router. Jeśli dopiero zaczynasz, nie martw się o specyfikę routera.
soulprovidr
1
więc mówisz, że w tej chwili powinienem używać tylko app.get ()? wciąż
mylę się,
11
@ nelson687 Tak naprawdę nie ma między nimi sztywnej reguły. Jeśli uważasz, że app'swłasne metody routingu, takie jak app.get(), są wystarczające dla twoich potrzeb, skorzystaj z nich. RouterWłaśnie tam dla wygody, aby pomóc Ci zorganizować aplikację na wielu modułów. Z przewodnika : „ Za pomocą tej express.Routerklasy można tworzyć modułowe moduły obsługi tras. RouterInstancja jest kompletnym oprogramowaniem pośredniczącym i systemem routingu; z tego powodu jest często nazywana„ mini-aplikacją ”.
Jonathan Lonowski,

Odpowiedzi:

323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dogs.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

Po var app = express()wywołaniu zwracany jest obiekt aplikacji. Pomyśl o tym jako o głównej aplikacji .

Po var router = express.Router()wywołaniu zwracana jest nieco inna mini aplikacja . Idea mini-aplikacji polega na tym, że każda trasa w Twojej aplikacji może stać się dość skomplikowana i możesz skorzystać z przeniesienia całego tego kodu do osobnego pliku. Router każdego pliku staje się mini-aplikacją , która ma bardzo podobną strukturę do głównej aplikacji .

W powyższym przykładzie kod trasy / Dogs został przeniesiony do własnego pliku, aby nie zaśmiecał głównej aplikacji . Kod dla / cats i / birds miałby podobną strukturę w swoich własnych plikach. Dzieląc ten kod na trzy mini-aplikacje , możesz pracować nad logiką dla każdej z nich osobno i nie martwić się, jak wpłynie ona na pozostałe dwie.

Jeśli masz kod (oprogramowanie pośrednie), który dotyczy wszystkich trzech tras, możesz umieścić go w głównej aplikacji przed app.use(...)połączeniami. Jeśli masz kod (oprogramowanie pośrednie), który dotyczy tylko jednej z tych tras, możesz umieścić go w pliku tylko dla tej trasy.

Nocturno
źródło
nie powinieneś przekazywać obiektu aplikacji, app.use('/dogs', dogs)(app)ponieważ definiujesz tam trasy, dodatkowo (i popraw mnie, jeśli się mylę), jeśli zrobisz to w ten sposób, w aplikacji znajduje się wcześniej całe oprogramowanie pośrednie a dodatkowe oprogramowanie pośrednie zostanie dodane do obiektu aplikacji (zakładając, że więcej oprogramowania pośredniego znajduje się na trasie psów). jeśli route.get('/dogs', route)go użyjesz , przekaże tylko oprogramowanie pośrednie do obiektu aplikacji podczas interakcji z trasami zdefiniowanymi w tym routerze, a jeśli zakres aplikacji jest poza trasą, nie będzie miał dostępu do tego oprogramowania pośredniego.
Ravenous,
1
Nie musisz przekazywać aplikacji na trasę, ponieważ trasa jest przekazywana do aplikacji za pomocą app.use('/dogs', show). W ten sposób trasa jest niezależna od aplikacji i może być ponownie użyta w dowolnej aplikacji Express. Oprogramowanie pośrednie umieszczone gdziekolwiek, zanim trasa zostanie wykorzystana przez tę trasę. Jeśli umieścisz oprogramowanie pośrednie ponad wszystkimi trasami w app.js, wówczas wszystkie trasy będą korzystać z tego oprogramowania pośredniego. Jeśli umieścisz oprogramowanie pośrednie w pliku trasy (dogs.js), wykorzysta go tylko ta trasa. Jeśli umieścisz oprogramowanie pośrednie za trasą GET w psach.js, będzie z niego korzystać tylko trasa POST (o ile zakończy się odpowiedzią).
Nocturno
Ahh mój zły. Chciałem to powiedzieć, app.get('/dogs'dogs,)(app)ponieważ pytanie dotyczyło funkcji get app.get i route.get. pokazywałeś, jak oddzielić trasy, aby można było nimi zarządzać. Ale czy moja anakdota nie byłaby poprawna, jeśli mówimy app.get? Jeśli mogę dostać się na PC, zmienię mój powyższy komentarz.
Ravenous,
2
Moja aplikacja nadal działa, kiedy użyć express.Router () lub wyrażenia (), nie mogłem zrozumieć różnicę :(
Ajay Suwalka
3
@Ajay Suwalka Nie wiem, jak mogę rozwinąć to, co już powiedziałem. Dokumenty mówią „Obiekt routera jest izolowanym wystąpieniem oprogramowania pośredniego i tras”. Podobał mi się także komentarz @Jonathan Lonowski powyżej: „A Routersam nie .listen()przyjmuje wniosków”. To może być główna różnica.
Nocturno
29

Express 4.0 jest dostarczany z nowym routerem. Jak wspomniano na stronie:

Klasy express.Router można używać do tworzenia modułowych modułów obsługi tras, które można montować. Instancja routera to kompletny system oprogramowania pośredniego i routingu; z tego powodu jest często nazywany „mini-aplikacją”.

Jest dobry artykuł na https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4, który opisuje różnice i co można zrobić z routerami.

Podsumowując

Za pomocą routerów możesz łatwiej modulować kod. Możesz używać routerów jako:

  1. Podstawowe trasy: Home, About
  2. Kieruj oprogramowanie pośrednie, aby rejestrować żądania do konsoli
  3. Trasa z parametrami
  4. Kieruj Middleware dla parametrów, aby sprawdzić poprawność określonych parametrów
  5. Sprawdza poprawność parametru przekazanego do określonej trasy

Uwaga:

app.routerObiektu, który został usunięty w Express 4, jest wykonany na powrót w Express, 5. W nowej wersji jest to odniesienie do podstawowej routera Express Express, w przeciwieństwie do 3, w którym aplikacja miał wyraźnie załadowaniem.

Alireza Fattahi
źródło
7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

Jak w powyższym przykładzie, możemy dodać inną metodę żądania HTTP w ramach trasy.

TILAK
źródło
5

Powiedzmy, że twoja aplikacja jest mało złożona. Najpierw dzielimy aplikację na wiele modułów, aby zmiany w jednym module nie zaśmiecały innych i można było kontynuować pracę nad poszczególnymi modułami, ale pod koniec dnia trzeba zintegrować wszystko w jeden, ponieważ budują jedną aplikację. To tak, jakbyśmy mieli jedną główną aplikację i kilka aplikacji potomnych, których rodzic jest główną aplikacją. Kiedy tworzymy aplikację nadrzędną, tworzymy ją za pomocą

var express = require('express');
var parent = express();

Do tej aplikacji nadrzędnej musimy wprowadzić aplikacje podrzędne. Ponieważ jednak aplikacje potomne nie są całkowicie różnymi aplikacjami (ponieważ działają w tym samym kontekście kontekstu java), express zapewnia sposób na wykonanie tego za pomocą funkcji routera Expresse, a to właśnie robimy w pliku każdego modułu potomnego i pozwala wywołać jeden taki moduł potomny jak aboutme .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

Przez module.exports udostępniamy ten moduł innym użytkownikom do wykorzystania, a ponieważ mamy zmodularyzowane elementy, musimy udostępnić pliki modułów aplikacji nadrzędnej za pomocą funkcji wymagającej węzła, podobnie jak inne moduły innych firm, a plik nadrzędny wygląda coś takiego.

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

po tym, jak udostępnimy ten moduł potomny rodzicowi, musimy powiedzieć aplikacji macierzystej, kiedy należy użyć tej aplikacji potomnej. Powiedzmy, że kiedy użytkownik natrafi na ścieżkę o mnie, potrzebujemy aplikacji potomnej o mnie, aby obsłużyć żądanie i robimy to za pomocą metody użycia Expresse .

parent.use('/aboutme',  aboutme);

i w jednym ujęciu plik macierzysty wygląda tak

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

Przede wszystkim, co rodzic może zrobić, to uruchomić serwer, na którym dziecko nie może. Mam nadzieję, że to wyjaśnia. Aby uzyskać więcej informacji, zawsze możesz zajrzeć do kodu źródłowego, co zajmuje trochę czasu, ale daje dużo informacji. Dziękuję Ci.

raj240
źródło
1
nie powinno tak być parent.use('/aboutme', child)?
Kees de Kooter
2

używanie app.js do pisania tras oznacza, że ​​są one dostępne dla wszystkich użytkowników, ponieważ app.js jest ładowany podczas uruchamiania aplikacji. Jednak umieszczanie tras w mini. express.router () chroni i ogranicza ich dostępność.

T.Soundarya
źródło
2

express.Router ma wiele opcji:

  • włącz rozróżnianie wielkości liter: /showtrasa ma nie być taka sama jak /Show, to zachowanie jest domyślnie wyłączone
  • ścisły tryb routingu: /show/kieruj na nie to samo, co /showto zachowanie jest również domyślnie wyłączone
  • możemy dodać określone oprogramowanie pośrednie do określonych tras
Ahmed Alawady
źródło
0

Jednym słowem, express.Routermożna zrobić więcej rzeczy w porównaniu do app.get(), takich jak oprogramowanie pośrednie, ponadto można zdefiniować jeszcze jeden obiekt routera za pomocąexpress.Router()

yuanfang wang
źródło