Modular Routing
Wyobraź sobie taki scenariusz: Jesteś właścicielem sklepu, który sprzedaje zwierzęta domowe, a klient chce kupić od Ciebie króliki i koty.
Jeśli użyjesz podstawowych metod routingu zdefiniowanych powyżej, kod będzie wyglądał tak:
Zauważ, że napisaliśmy te same trasy wiele razy.
Jednakże, pisanie tras w kółko zwiększa redundancję i ilość literówek. Ponadto, warto uczynić nasz kod bardziej modułowym, gdyż jest to dobra praktyka.
Jako programista, zawsze chcesz, aby Twój kod wyglądał czyściej. Aby powyższy kod był łatwiejszy do odczytania, możemy użyć dwóch metod.
Użycie app.route
W tym miejscu pojawia się app.route
. Napiszesz ścieżkę raz, i możesz łańcuchować wiele route handlers.
Możesz zaimplementować app.route
w następujący sposób:
app.route(PATH)
.get(callback)
.post(callback)
//can add more HTTP requests (.put, .delete, etc)
Możemy teraz przepisać kod :
Kod wygląda czyściej, a trasę dla każdego żądania HTTP trzeba było podać tylko raz.
Jest jednak jeszcze jedno zastrzeżenie: parametr username
istnieje we wszystkich trasach. Wpisywanie username
raz za razem wciąż sprzyja literówkom i nadmiarowości. A gdybyśmy mogli uczynić to jeszcze bardziej modularnym?
express.Router()
Możemy użyć express.Router()
do tworzenia modularnych, montowalnych handlerów tras. Instancja Router
jest kompletnym oprogramowaniem pośredniczącym i systemem routingu, dlatego często określa się ją mianem „mini-aplikacji.”
Musimy tylko określić punkt początkowy, a instancja Router
zajmie się resztą za nas.
Aby użyć app.Router()
, musimy stworzyć osobny moduł, stworzyć instancję app.Router
, a następnie użyć module.exports
do wyeksportowania instancji.
Po więcej szczegółów na temat używania module.exports
, zobacz mój poprzedni artykuł.
W tym przykładzie, będziemy po prostu obsługiwać prostą ścieżkę, która zawierałaby parametry username
i id
.
W routerExample.js
:
Używamy router.route()
, który jest podobny do app.route
. Zdefiniowany moduł mówi: „Tak długo, jak ścieżka będzie kończyć się /:username/:id
, wykonaj następujący kod zgodnie z definicją.”
Aby go użyć, użyj innego modułu, main.js
:
Jak mówią komentarze, używamy app.use
, aby powiedzieć routeExample.js
, aby wykonywał funkcje, które mają trasy zaczynające się od pierwszego parametru. Pierwszy parametr może być określany jako punkt początkowy. Dlatego ścieżka będzie miała postać starting point + PATH defined by router
.
Na przykład, zgodnie z linią 6, będziemy teraz obsługiwać żądania GET i POST, które zaczynają się od ‘/cats’
. Będą one miały ścieżkę cats/:username/:id
.
Jak zawsze, możesz używać różnych ścieżek w module routeExample
, ale jedyną rzeczą, którą musisz określić, jest punkt początkowy w app.use
.
Aby uruchomić kod, wpisz node main
w oknie terminala i odpowiednio użyj cURL
w innym oknie.
Różne trasy w express.Router z middleware
W tym przykładzie, będziemy nawigować do strony głównej Ptaki naszego sklepu zoologicznego i zdefiniujemy funkcję middleware, timeLog
, która wyprowadzi czas, w którym dana ścieżka została zażądana.
birds.js
:
W main.js
:
var birds = require('./birds')
app.use('/birds', birds) //handle /birds and /birds/about
Użyj polecenia node
, aby uruchomić kod, a następnie użyj cURL
w taki sposób:
Tak więc, możliwe jest w express.Router
wykonywanie funkcji middleware tylko w określonych ścieżkach.