假设我想要大致如下所示的 REST 端点:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
每个 if 上的 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);
指向 item
的 URL 是 user
的 URL 层次结构的后代。现在我如何使用 /users
获取 URL 到 userRouter 但更具体的路由 /user/*user_id*/items/
到 itemRouter?而且,如果可能的话,我希望 itemRouter 也可以访问 user_id。
原文由 huggie 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以通过将路由器作为 中间件 附加到其他路由器上来嵌套路由器,无论是否使用
params
。如果要从父路由器访问
params
,则必须将{mergeParams: true}
传递给子路由器。mergeParams
在 Express 中引入4.5.0
(2014 年 7 月 5 日)在此示例中,
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