Supposons que je veuille avoir des points de terminaison REST qui ressemblent à peu près à ceci:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUD sur chacun si cela a du sens. Par exemple, / user POST crée un nouvel utilisateur, GET récupère tous les utilisateurs. / user / user_id GET ne récupère qu'un seul utilisateur.
Les éléments sont spécifiques à l'utilisateur, je les mets donc sous user_id , qui est un utilisateur particulier.
Maintenant, pour rendre le routage Express modulaire, j'ai créé quelques instances de routeur. Il y a un routeur pour l'utilisateur et un routeur pour l'article.
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);
L'URL vers item
est les descendants de la hiérarchie d'URL du user
. Maintenant, comment puis-je obtenir une URL avec /users
quoi que ce soit à userRouter, mais la route plus spécifique de /user/*user_id*/items/
à itemRouter? Et aussi, je voudrais que user_id soit également accessible à itemRouter, si possible.
la source
Réponses:
Vous pouvez imbriquer des routeurs en les attachant comme middleware sur un autre routeur, avec ou sans
params
.Vous devez passer
{mergeParams: true}
au routeur enfant si vous souhaitez accéder au àparams
partir du routeur parent.mergeParams
a été introduit dans Express4.5.0
(5 juillet 2014)Dans cet exemple, l'
itemRouter
attache à lauserRouter
sur l'/:userId/items
itinéraireCela entraînera les itinéraires possibles suivants:
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
la source
itinéraires imbriqués gérables ...
Je voulais un exemple spécifique de faire des routes imbriquées d'une manière très gérable dans express 4 et c'était le premier résultat de recherche pour "routes imbriquées dans express". Voici une API qui aurait de nombreuses routes qui devraient être interrompues par exemple.
./index.js:
./routes/api/index.js:
./routes/api/products.js:
Exemple d'imbrication dans la structure de dossiers
J'ai remarqué quelques commentaires sur la "structure des dossiers d'imbrication". Cela est implicite mais pas évident, j'ai donc ajouté la section ci-dessous. Voici un exemple spécifique de structure de dossiers imbriqués pour les itinéraires .
Ceci est plus un exemple général du fonctionnement du nœud. Si vous utilisez "index.js" dans des dossiers de la même manière que "index.html" fonctionne dans les pages Web pour un répertoire par défaut, il sera facile de faire évoluer votre organisation en fonction de la récursivité sans modifier vos points d'entrée en code. "index.js" est le document par défaut auquel on accède lors de l'utilisation de require dans un répertoire.
contenu de index.js
contenu de /api/index.js
contenu de /api/admin/index.js
contenu de /api/admin/users/index.js
Il y a peut-être des problèmes DRY ici, mais cela se prête bien à l'encapsulation des préoccupations.
FYI, récemment, je suis entré dans l'actionhero et j'ai trouvé qu'il était complet avec des sockets et des tâches, plus comme un véritable cadre tout-en-un renversant le paradigme REST. Vous devriez probablement le vérifier en allant nu avec express.
la source
La clé de la deuxième partie de votre question est l'utilisation de l'option mergeParams
De
/user/jordan/item/cat
je reçois une réponse:la source
Utilisation de la solution @Jason Sebring et adaptation à Typescript.
server.ts
/api/routes/index.ts
/api/routes/home.ts
la source
./api/routes
?./api/routes
a deux fichiersindex.ts
ethome.ts
. Le premier est utilisé parserver.ts
. J'espère que cela vous aidera.la source
Vous n'avez besoin que d'un seul routeur et utilisez-le comme ceci:
la source
items
appartient àusers
droite, pourquoi avez-vous besoin de séparer cela? vous pouvez les définir dans différents fichiers en utilisant toujours le même routeur si vous le souhaitez.