Предположим, я хочу иметь конечные точки REST, которые выглядят примерно так:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUD на каждый, если имеет смысл. Например, / user POST создает нового пользователя, GET выбирает всех пользователей. / user / user_id GET выбирает только этого одного пользователя.
Элементы зависят от пользователя, поэтому я помещаю их в user_id , который является конкретным пользователем.
Теперь, чтобы сделать модульную маршрутизацию Express, я сделал несколько экземпляров маршрутизатора. Существует маршрутизатор для пользователя и маршрутизатор для элемента.
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, если это возможно.
источник
Ответы:
Вы можете вкладывать маршрутизаторы, подключая их в качестве промежуточного ПО на другом маршрутизаторе, с или без
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
источник
управляемые вложенные маршруты ...
Я хотел конкретный пример выполнения вложенных маршрутов в Express 4 очень управляемым способом, и это был лучший результат поиска для «вложенных маршрутов в экспрессе». Вот API, который будет иметь много маршрутов, которые необходимо разбить, например.
./index.js:
./routes/api/index.js:
./routes/api/products.js:
Пример вложенности в структуру папок
Я заметил несколько комментариев о "структуре вложенных папок". Это подразумевается в этом, однако не очевидно, поэтому я добавил раздел ниже. Вот конкретный пример структуры вложенных папок для маршрутов .
Это более общий пример того, как работает узел. Если вы используете «index.js» в папках аналогично тому, как «index.html» работает на веб-страницах для каталога по умолчанию, будет легко масштабировать вашу организацию на основе рекурсии, не меняя точки входа на код. index.js - это документ по умолчанию, доступ к которому осуществляется при использовании require в каталоге.
содержимое index.js
содержимое /api/index.js
содержимое /api/admin/index.js
содержимое /api/admin/users/index.js
Возможно, здесь есть некоторые проблемы с СУХОЙ, но это хорошо поддается инкапсуляции проблем.
К вашему сведению, недавно я попал в actionhero и обнаружил, что он является полнофункциональным с сокетами и задачами, больше похож на настоящую платформу «все в одном», которая переворачивает парадигму REST с ног на голову. Вы, вероятно, должны проверить это, пройдя голый с экспрессом.
источник
Ключ ко второй части вашего вопроса - использование опции mergeParams
От
/user/jordan/item/cat
ответа я получаю:источник
Использование решения @Jason Sebring и адаптация для Typescript.
server.ts
/api/routes/index.ts
/api/routes/home.ts
источник
./api/routes
?./api/routes
имеет два файлаindex.ts
иhome.ts
. Первый используетсяserver.ts
. Надеюсь, это поможет вам.источник
Вам нужен только один маршрутизатор, и используйте его так:
источник
items
принадлежат кusers
праву, почему вы должны отделить это? Вы можете определить их в разных файлах, используя тот же маршрутизатор, если хотите.