Отдых с Экспресс.в JS вложенные маршрутизатор



предположим, что я хочу иметь конечные точки REST, которые выглядят примерно так:



/user/
/user/user_id

/user/user_id/items/
/user/user_id/items/item_id


CRUD на каждом, если имеет смысл. Например, /user POST создает нового пользователя, GET выбирает всех пользователей. / пользователь/ид_пользователя GET выбирает только одного пользователя.



элементы зависят от пользователя, поэтому я помещаю их под ид_пользователя, который является конкретным пользователем.



теперь, чтобы сделать экспресс-маршрутизацию модульной, я сделал несколько экземпляров маршрутизатора. Существует маршрутизатор для пользователя, и маршрутизатор для элемента.



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 - это потомки иерархии URL-адрес user. Теперь как мне получить URL с /users что угодно для userRouter, но более конкретный маршрут /user/*user_id*/items/ к itemRouter? А также, я хотел бы user_id, чтобы быть доступным для itemRouter, а также, если это возможно.

586   5  

5 ответов:

вы можете вложить маршрутизаторы, прикрепив их как middleware на другом маршрутизаторе, С или без params.

вы должны пройти {mergeParams: true} роутер ребенка, если вы хотите получить доступ к params от вышестоящего маршрутизатора.

mergeParams представил в Экспресс 4.5.0 (5 июля 2014)

в этом примере itemRouter привязывается к userRouter на /:userId/items маршрут

это приведет к следующим возможные маршруты:

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);

управляемые вложенные маршруты...

Я хотел конкретный пример выполнения вложенных маршрутов очень управляемым способом в express 4, и это был лучший результат поиска для "вложенных маршрутов в express". Вот API, который будет иметь много маршрутов, которые должны быть разбиты на образец.

./индекс.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;

./ маршруты / api / продукты.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;

пример вложенности в структуре папок

я заметил некоторые комментарии по "вложенности структуры папок". Это подразумевается при этом, однако, не очевидно, поэтому я добавил ниже. Вот конкретный пример вложенная структура папок маршруты.

index.js
/api
  index.js
  /admin
    index.js
    /users
      index.js
      list.js
    /permissions
      index.js
      list.js

это более общий пример того, как узел работает. Если вы используете индекс".Яш" в папках аналогично тому, как индекс".html " работает на веб-страницах по умолчанию для каталога, это будет легко масштабировать вашу организацию на основе рекурсии без изменения точек входа в код. "индекс.js " - это документ по умолчанию, доступный при использовании требуются в каталоге.

содержание индекс.js

const express = require('express');
const router = express.Router();
router.use('/api', require('./api'));
module.exports = router;

содержимое /api / index.js

const express = require('express');
const router = express.Router();
router.use('/admin', require('./admin'));
module.exports = router;

содержимое /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;

содержимое /api / admin/users / index.js

const express = require('express');
const router = express.Router();
router.get('/', require('./list'));
module.exports = router;

здесь есть некоторые сухие проблемы, возможно, но это хорошо поддается инкапсуляции проблем.

к вашему сведению, я недавно попала в actionhero и нашли его, чтобы быть полнофункциональным Вт/розетки и задачи, больше похоже на истинную структуру "все-в-одном", переворачивающую парадигму отдыха с ног на голову. Вы, вероятно, должны проверить его над идти голым ж/ экспресс.

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);

ключом ко второй части вашего вопроса является использование опции mergeParams

var itemRouter = require('express').Router({ mergeParams: true }); 

С /user/jordan/item/cat Я получаю ответ:

{"user_id":"jordan","item_id":"cat"}

используя решение @Jason Sebring и адаптируясь к Typescript.

сервер.ТС

import Routes from './api/routes';
app.use('/api/', Routes);

/ api / routes / index.ТС

import { Router } from 'express';
import HomeRoutes from './home';

const router = Router();

router.use('/', HomeRoutes);
// add other routes...

export default router;

/ api / routes / home.ТС

import { Request, Response, Router } from 'express';

const router = Router();

router.get('/', (req: Request, res: Response) => {
  res.json({
    message: 'Welcome to API',
  });
});

export default router;

вам нужен только один маршрутизатор и использовать его как это:

router.get('/users');
router.get('/users/:user_id');

router.get('/users/:user_id/items');
router.get('/users/:user_id/items/:item_id');

app.use('api/v1', router);

Comments

    Ничего не найдено.