假设我想要具有如下的REST端点:
Suppose I want to have REST endpoints which look roughly like this:
/user/ /user/user_id /user/user_id/items/ /user/user_id/items/item_id每个CRUD都有意义。例如,/ user POST创建一个新用户,GET获取所有用户。 / user / user_id GET只能获取一个用户。
CRUD on each if makes sense. For example, /user POST creates a new user, GET fetches all users. /user/user_id GET fetches just that one user.
项目是用户特定的,所以我把它们放在 user_id ,这是一个特定的用户。
Items are user specific so I put them under user_id, which is a particular user.
现在做出快速路由模块化我做了几个路由器实例。有一个用户的路由器和该项目的路由器。
Now to make Express routing modular I made a few router instances. There is a router for user, and a router for the item.
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到项目是URL的后代用户的层次结构。现在如何使用 / users 获取URL,而不是使用userRouter,但是更具体的 / user / * user_id * / items / 到itemRouter?另外,如果可能的话,我也希望可以对itemRouter使用user_id。
URL to item is descendents of the URL hierarchy of the user. Now how do I get URL with /users whatever to userRouter but the more specific route of /user/*user_id*/items/ to the itemRouter? And also, I would like user_id to be accessible to itemRouter as well, if possible.
推荐答案可以通过连接来嵌套路由器作为其他路由器上的中间件,带或不带 params 。
You can nest routers by attaching them as middleware on an other router, with or without params.
如果您要访问<$ c $,则必须将 {mergeParams:true} c> params 从父路由器。
You must pass {mergeParams: true} to the child router if you want to access the params from the parent router.
mergeParams 已在快乐 4.5.0 (2014年7月5日)
mergeParams was introduced in Express 4.5.0 (Jul 5 2014)
这个例子 itemRouter 附加到 / code> /:userId / items 路线
这将导致以下可能的路线:
This will result in following possible routes:
GET / user - > hello user GET / user / 5 - > hello user 5 GET / user / 5 / items - > 来自用户5的hello项目 GET / user / 5 / items / 6 - > hello第6项来自用户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);更多推荐
休息与Express.js嵌套路由器
发布评论