Załóżmy, że chcę mieć punkty końcowe REST, które wyglądają mniej więcej tak:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUD na każdym, jeśli ma sens. Na przykład / user POST tworzy nowego użytkownika, GET pobiera wszystkich użytkowników. / user / user_id GET pobiera tylko tego jednego użytkownika.
Elementy są specyficzne dla użytkownika, więc umieściłem je pod user_id , który jest konkretnym użytkownikiem.
Aby uczynić routing Express modularnym, stworzyłem kilka instancji routera. Istnieje router dla użytkownika i router dla elementu.
var userRouter = require('express').Router();
userRouter.route('/')
.get(function() {})
.post(function() {})
userRouter.route('/:user_id')
.get(function() {})
var itemRouter = require('express').Router();
itemRouter.route('/')
.get(function() {})
.post(function() {})
itemRouter.route('/:item_id')
.get(function() {})
app.use('/users', userRouter);
// Now how to add the next router?
// app.use('/users/', itemRouter);
Adres URL do item
jest potomkami hierarchii adresów URL pliku user
. Teraz, jak mogę uzyskać adres URL z /users
czymkolwiek do userRouter, ale z bardziej szczegółową trasą /user/*user_id*/items/
do itemRouter? Chciałbym również, aby user_id był dostępny również dla itemRouter, jeśli to możliwe.
źródło
Odpowiedzi:
Routery można zagnieżdżać, dołączając je jako oprogramowanie pośredniczące na innym routerze, z lub bez
params
.Musisz przejść
{mergeParams: true}
do routera podrzędnego, jeśli chcesz uzyskać dostęp doparams
routera nadrzędnego.mergeParams
został wprowadzony w Express4.5.0
(5 lipca 2014)W tym przykładzie
itemRouter
przywiązuje się douserRouter
na/:userId/items
trasieSkutkuje to następującymi możliwymi trasami:
GET /user
->hello user
GET /user/5
->hello user 5
GET /user/5/items
->hello items from user 5
GET /user/5/items/6
->hello item 6 from user 5
źródło
zarządzalne trasy zagnieżdżone ...
Chciałem uzyskać konkretny przykład wykonywania zagnieżdżonych tras w bardzo łatwy w zarządzaniu sposób w ekspresie 4 i był to najlepszy wynik wyszukiwania dla „tras zagnieżdżonych w ekspresie”. Oto interfejs API, który miałby wiele tras, które należałoby na przykład podzielić.
./index.js:
./routes/api/index.js:
./routes/api/products.js:
Przykład zagnieżdżenia w strukturze folderów
Zauważyłem kilka komentarzy na temat „zagnieżdżania struktury folderów”. Jest to zasugerowane, ale nie jest oczywiste, więc dodałem sekcję poniżej. Oto konkretny przykład zagnieżdżonej struktury folderów dla tras .
To jest bardziej ogólny przykład działania węzła. Jeśli używasz „index.js” w folderach, podobnie jak „index.html” działa na stronach internetowych dla domyślnego katalogu, będzie to łatwe do skalowania organizacji w oparciu o rekursję bez zmiany punktów wejścia na kod. „index.js” jest domyślnym dokumentem, do którego uzyskuje się dostęp podczas korzystania z require w katalogu.
zawartość pliku index.js
zawartość /api/index.js
zawartość /api/admin/index.js
zawartość /api/admin/users/index.js
Prawdopodobnie jest tu kilka problemów SUCHYCH, ale dobrze nadaje się do hermetyzacji obaw.
FYI, niedawno wkręciłem się w actionhero i odkryłem, że jest to w pełni funkcjonalny z gniazdami i zadaniami, bardziej jak prawdziwy framework all-in-one, który przewraca paradygmat REST na głowę. Prawdopodobnie powinieneś to sprawdzić na nago w / express.
źródło
Kluczem do drugiej części twojego pytania jest użycie opcji mergeParams
Od
/user/jordan/item/cat
kiedy otrzymam odpowiedź:źródło
Korzystanie z rozwiązania @Jason Sebring i dostosowywanie do Typescript.
server.ts
/api/routes/index.ts
/api/routes/home.ts
źródło
./api/routes
?./api/routes
ma dwa plikiindex.ts
ihome.ts
. Pierwszy jest używany przezserver.ts
. Mam nadzieję, że to ci pomoże.źródło
Potrzebujesz tylko jednego routera i używaj go w ten sposób:
źródło
items
należy dousers
right, dlaczego musisz to oddzielać? jeśli chcesz, możesz zdefiniować je w różnych plikach, nadal używając tego samego routera.