假设我想拥有大致如下所示的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 routing模块化,我做了几个路由器实例。有一个用于用户的路由器,以及一个用于项目的路由器。
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,除了/user/*user_id*/items/
到itemRouter的更具体的路由之外,还有什么userRouter?而且,如果可能的话,我希望itemRouter也能访问user_id。
发布于 2014-08-14 17:59:50
无论是否使用params
,您都可以通过将路由器作为middleware连接到另一台路由器上来嵌套路由器。
如果要从父路由器访问params
,则必须将{mergeParams: true}
传递给子路由器。
Express 4.5.0
中引入了mergeParams
(2014年7月5日)
在此示例中,itemRouter
连接到/:userId/items
路由上的userRouter
这将导致以下可能的路由:
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);
发布于 2014-08-15 00:42:19
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_id":"jordan","item_id":"cat"}
发布于 2020-07-27 21:13:43
const userRouter = require("express").Router({ mergeParams: true });
export default ()=>{
userRouter
.route("/")
.get(getUser)
.post(postUser);
userRouter.route("/:user_id").get(function () {});
}
https://stackoverflow.com/questions/25260818
复制相似问题