Supongamos que quiero tener puntos finales REST que se vean más o menos así:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUDO en cada uno si tiene sentido. Por ejemplo, / user POST crea un nuevo usuario, GET obtiene todos los usuarios. / user / user_id GET obtiene solo ese usuario.
Los elementos son específicos del usuario, por lo que los coloco en user_id , que es un usuario en particular.
Ahora, para hacer que el enrutamiento Express sea modular, hice algunas instancias de enrutador. Hay un enrutador para el usuario y un enrutador para el artículo.
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 a item
es descendientes de la jerarquía de URL de user
. Ahora, ¿cómo obtengo URL con /users
lo que sea para userRouter pero la ruta más específica de /user/*user_id*/items/
itemRouter? Y también, me gustaría que user_id también sea accesible para itemRouter, si es posible.
fuente
Respuestas:
Puede anidar enrutadores al conectarlos como middleware en otro enrutador, con o sin ellos
params
.Debe pasar
{mergeParams: true}
al enrutador secundario si desea acceder alparams
enrutador principal.mergeParams
se introdujo en Express4.5.0
(5 de julio de 2014)En este ejemplo, el
itemRouter
se adjunta auserRouter
la/:userId/items
rutaEsto dará como resultado las siguientes rutas posibles:
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
fuente
rutas anidadas manejables ...
Quería un ejemplo específico de hacer rutas anidadas de una manera muy manejable en express 4 y este fue el principal resultado de búsqueda para "rutas anidadas en express". Aquí hay una API que tendría muchas rutas que deberían dividirse, por ejemplo.
./index.js:
./routes/api/index.js:
./routes/api/products.js:
Ejemplo de anidamiento en estructura de carpetas
Noté algunos comentarios sobre "estructura de carpetas de anidación". Está implícito en esto, sin embargo, no es obvio, así que agregué la sección a continuación. Aquí hay un ejemplo específico de una estructura de carpetas anidadas para rutas .
Este es más un ejemplo general de cómo funciona el nodo. Si usa "index.js" en carpetas de forma similar a cómo funciona "index.html" en las páginas web para un directorio predeterminado, será fácil escalar su organización en función de la recursividad sin cambiar sus puntos de entrada al código. "index.js" es el documento predeterminado al que se accede cuando se requiere require en un directorio.
contenido de index.js
contenido de /api/index.js
contenido de /api/admin/index.js
contenido de /api/admin/users/index.js
Posiblemente hay algunos problemas SECOS aquí, pero se presta bien para encapsular las preocupaciones.
Para su información, recientemente me metí en actionhero y he encontrado que tiene todas las funciones con enchufes y tareas, más como un verdadero marco todo en uno que cambia el paradigma REST en su cabeza. Probablemente deberías echarle un vistazo antes de desnudarte con express.
fuente
La clave para la segunda parte de su pregunta es el uso de la opción mergeParams
De
/user/jordan/item/cat
recibo una respuesta:fuente
Usando la solución @Jason Sebring y adaptándome para Typecript.
server.ts
/api/routes/index.ts
/api/routes/home.ts
fuente
./api/routes
?./api/routes
tiene dos archivosindex.ts
yhome.ts
. El primero es usado porserver.ts
. Espero que te ayude.fuente
Solo necesita un enrutador y úselo así:
fuente
items
pertenece a lausers
derecha, ¿por qué necesitas separar eso? puede definirlos en diferentes archivos que todavía usan el mismo enrutador si así lo desea.