Saltar al contenido

Resto con el enrutador anidado Express.js

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *