Отдых с Экспресс.в 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, а также, если это возможно.
5 ответов:
вы можете вложить маршрутизаторы, прикрепив их как middleware на другом маршрутизаторе, С или без
params.вы должны пройти
{mergeParams: true}роутер ребенка, если вы хотите получить доступ кparamsот вышестоящего маршрутизатора.
mergeParamsпредставил в Экспресс4.5.0(5 июля 2014)в этом примере
itemRouterпривязывается кuserRouterна/:userId/itemsмаршрутэто приведет к следующим возможные маршруты:
GET /user->hello userGET /user/5->hello user 5GET /user/5/items->hello items from user 5GET /user/5/items/6->hello item 6 from user 5var 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