假设我想拥有大致如下所示的 REST 端点:
/user/ /user/user_id /user/user_id/items/ /user/user_id/items/item_id
CRUD 对每个 if 有意义。例如,/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 toitem是user. 现在,我如何获取包含 userRouter 的 URL,/users但获取 itemRouter 的更具体的路由/user/*user_id*/items/?而且,如果可能的话,我希望 itemRouter 也可以访问 user_id。
item
user
/users
/user/*user_id*/items/
您可以通过将路由器作为中间件附加到其他路由器上来嵌套路由器,无论是否带有params.
params
如果要从父路由器{mergeParams: true}访问,则必须传递给子路由器。params
{mergeParams: true}
mergeParams在Express4.5.0中引入(2014 年 7 月 5 日)
mergeParams
4.5.0
在此示例中,itemRouter附加到userRouter路线/:userId/items上
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
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);