Este dilema se puede abordar de variadas formas, pero te dejamos la respuesta más completa para nosotros.
Solución:
Puede anidar enrutadores conectándolos como middleware en otro enrutador, con o sin params
.
debes pasar mergeParams: true
al enrutador secundario si desea acceder al params
del enrutador principal.
mergeParams
fue introducido en Express 4.5.0
(5 de julio de 2014)
En este ejemplo el itemRouter
se apega a la userRouter
sobre el /:userId/items
ruta
Esto 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
var express = require('express');
var app = express();
var userRouter = express.Router();
// you need to set mergeParams: true on the router,
// if you want to access params from the parent router
var itemRouter = express.Router(mergeParams: true);
// you can nest routers by attaching them as middleware:
userRouter.use('/:userId/items', itemRouter);
userRouter.route('/')
.get(function (req, res)
res.status(200)
.send('hello users');
);
userRouter.route('/:userId')
.get(function (req, res)
res.status(200)
.send('hello user ' + req.params.userId);
);
itemRouter.route('/')
.get(function (req, res)
res.status(200)
.send('hello items from user ' + req.params.userId);
);
itemRouter.route('/:itemId')
.get(function (req, res)
res.status(200)
.send('hello item ' + req.params.itemId + ' from user ' + req.params.userId);
);
app.use('/user', userRouter);
app.listen(3003);
rutas anidadas manejables…
Quería un ejemplo específico de cómo hacer rutas anidadas de una manera muy manejable en express 4 y este fue el resultado de búsqueda principal para “rutas anidadas en express”. Aquí hay una API que tendría muchas rutas que deberían dividirse, por ejemplo.
./index.js:
var app = require('express')();
// anything beginning with "/api" will go into this
app.use('/api', require('./routes/api'));
app.listen(3000);
./routes/api/index.js:
var router = require('express').Router();
// split up route handling
router.use('/products', require('./products'));
router.use('/categories', require('./categories'));
// etc.
module.exports = router;
./routes/api/productos.js:
var router = require('express').Router();
// api/products
router.get('/', function(req, res)
res.json( products: [] );
);
// api/products/:id
router.get('/:id', function(req, res)
res.json( id: req.params.id );
);
module.exports = router;
Ejemplo de anidamiento en la estructura de carpetas
Noté algunos comentarios sobre “estructura de carpetas anidadas”. Está implícito en esto, sin embargo, no es obvio, así que agregué la sección a continuación. He aquí un ejemplo específico de un estructura de carpetas anidadas para rutas.
index.js
/api
index.js
/admin
index.js
/users
index.js
list.js
/permissions
index.js
list.js
Este es más un ejemplo general de cómo funciona el nodo. Si usa “index.js” en carpetas de manera similar a cómo funciona “index.html” en 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 usa exigir en un directorio.
contenido de index.js
const express = require('express');
const router = express.Router();
router.use('/api', require('./api'));
module.exports = router;
contenido de /api/index.js
const express = require('express');
const router = express.Router();
router.use('/admin', require('./admin'));
module.exports = router;
contenido de /api/admin/index.js
const express = require('express');
const router = express.Router();
router.use('/users', require('./users'));
router.use('/permissions', require('./permissions'));
module.exports = router;
contenido de /api/admin/users/index.js
const express = require('express');
const router = express.Router();
router.get('/', require('./list'));
module.exports = router;
Es posible que aquí haya algunos problemas SECO, pero se presta bien para encapsular las preocupaciones.
FYI, recientemente entré en actionhero y descubrí que tiene todas las funciones con sockets y tareas, más como un true marco todo en uno volteando el paradigma REST en su cabeza. Probablemente deberías echarle un vistazo a ir desnudo con express.
var userRouter = require('express').Router();
var itemRouter = require('express').Router( mergeParams: true );
userRouter.route('/')
.get(function(req, res) )
.post(function(req, res) )
userRouter.route('/:user_id')
.get(function() )
itemRouter.route('/')
.get(function(req, res) )
.post(function(req, res) )
itemRouter.route('/:item_id')
.get(function(req, res)
return res.send(req.params);
);
app.use('/user/', userRouter);
app.use('/user/:user_id/item', itemRouter);
los key a la segunda parte de su pregunta es el uso de la opción mergeParams
var itemRouter = require('express').Router( mergeParams: true );
Desde /user/jordan/item/cat
me sale una respuesta:
"user_id":"jordan","item_id":"cat"
Puntuaciones y reseñas
Si conservas algún recelo y capacidad de aclarar nuestro tutorial puedes dejar una acotación y con placer lo ojearemos.