Angenommen, ich möchte REST-Endpunkte haben, die ungefähr so aussehen:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUD auf jedem, wenn es Sinn macht. Wenn beispielsweise / user POST einen neuen Benutzer erstellt, ruft GET alle Benutzer ab. / user / user_id GET ruft nur diesen einen Benutzer ab.
Die Elemente sind benutzerspezifisch, daher habe ich sie unter user_id abgelegt , bei der es sich um einen bestimmten Benutzer handelt.
Um das Express-Routing modular zu gestalten, habe ich einige Router-Instanzen erstellt. Es gibt einen Router für den Benutzer und einen Router für das Element.
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);
URL to item
ist ein Nachkomme der URL-Hierarchie des user
. Wie erhalte ich nun eine URL mit /users
irgendetwas zu userRouter, aber der spezifischeren Route /user/*user_id*/items/
zum itemRouter? Außerdem möchte ich, dass user_id nach Möglichkeit auch itemRouter zugänglich ist.
quelle
Antworten:
Sie können Router verschachteln, indem Sie sie mit oder ohne Middleware an einen anderen Router anschließen
params
.Sie müssen
{mergeParams: true}
an den untergeordneten Router übergeben, wenn Sieparams
vom übergeordneten Router aus auf den zugreifen möchten .mergeParams
wurde in Express eingeführt4.5.0
(5. Juli 2014)In diesem Beispiel
itemRouter
wird dasuserRouter
an die/:userId/items
Route angehängtDies führt zu folgenden möglichen Routen:
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
quelle
überschaubare verschachtelte Routen ...
Ich wollte ein spezielles Beispiel dafür, wie verschachtelte Routen in Express 4 auf sehr überschaubare Weise ausgeführt werden. Dies war das Top-Suchergebnis für "verschachtelte Routen in Express". Hier ist eine API mit vielen Routen, die beispielsweise aufgelöst werden müssten.
./index.js:
./routes/api/index.js:
./routes/api/products.js:
Verschachtelungsbeispiel in Ordnerstruktur
Ich habe einige Kommentare zu "Verschachtelungsordnerstruktur" bemerkt. Dies ist jedoch nicht offensichtlich, daher habe ich den folgenden Abschnitt hinzugefügt. Hier ist ein spezielles Beispiel für eine verschachtelte Ordnerstruktur für Routen .
Dies ist eher ein allgemeines Beispiel für die Funktionsweise des Knotens. Wenn Sie "index.js" in Ordnern ähnlich wie "index.html" auf Webseiten für einen Verzeichnisstandard verwenden, können Sie Ihre Organisation auf der Grundlage der Rekursion leicht skalieren, ohne Ihre Einstiegspunkte in Code zu ändern. "index.js" ist das Standarddokument, auf das bei Verwendung von require in einem Verzeichnis zugegriffen wird .
Inhalt von index.js
Inhalt von /api/index.js
Inhalt von /api/admin/index.js
Inhalt von /api/admin/users/index.js
Möglicherweise gibt es hier einige DRY-Probleme, aber es eignet sich gut zur Zusammenfassung von Bedenken.
Zu Ihrer Information, vor kurzem bin ich zu Actionhero gekommen und habe festgestellt, dass es mit Sockets und Aufgaben ausgestattet ist, eher wie ein echtes All-in-One-Framework, das das REST-Paradigma auf den Kopf stellt. Du solltest es dir wahrscheinlich ansehen, wenn du nackt mit Express bist.
quelle
Der Schlüssel zum zweiten Teil Ihrer Frage ist die Verwendung der Option mergeParams
Von
/user/jordan/item/cat
bekomme ich eine Antwort:quelle
Verwenden der @ Jason Sebring-Lösung und Anpassen an Typescript.
server.ts
/api/routes/index.ts
/api/routes/home.ts
quelle
./api/routes
?./api/routes
hat zwei Dateienindex.ts
undhome.ts
. Der erste wird von verwendetserver.ts
. Hoffe es wird dir helfen.quelle
Sie benötigen nur einen Router und verwenden ihn folgendermaßen:
quelle
items
gehören nachusers
rechts, warum musst du das trennen? Sie können sie in verschiedenen Dateien definieren, die immer noch denselben Router verwenden, wenn Sie dies möchten.