假设我希望RESTendpoint大致如下所示:
/user/
/user/user_id
/user/user_id/items/
/user/user_id/items/item_id
CRUD对每个如果都有意义。例如, /userPOST创建一个新用户,GET获取所有用户。 /user/user_idGET只获取一个用户。
项目是特定于用户的,所以我将它们放在user_id下,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是user
的URL层次结构的后代。现在,我如何获得URL与/用户
无论user路由器,但更具体的路线的/user/*user_id*/项目/
到item路由器?此外,如果可能的话,我希望user_id也可以访问itemRout。
您可以通过将路由器作为中间件附加到其他路由器上来嵌套路由器,无论是否使用params
。
如果要从父路由器访问params
,则必须将{mergeParams: true}
传递给子路由器。
Express4.5中引入了
mergeParams
。0(2014年7月5日)
在此示例中,itemRouter
连接到/:userId/items
路由上的userRouter
这将导致以下可能的路线:
GET/user
-
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);
我想要一个在快速4中以非常易于管理的方式执行嵌套路线的具体示例,这是“快速嵌套路线”的顶级搜索结果。例如,这里有一个应用编程接口,它有许多需要分解的路由。
./指数js:
var app = require('express')();
// anything beginning with "/api" will go into this
app.use('/api', require('./routes/api'));
app.listen(3000);
./路线/api/index.js:
var router = require('express').Router();
// split up route handling
router.use('/products', require('./products'));
router.use('/categories', require('./categories'));
// etc.
module.exports = router;
./路线/api/products.js:
var router = require('express').Router();
// api/products
router.get('/', function(req, res) {
res.json({ products: [] });
});
// api/products/:id
router.get('/:id', function(req, res) {
res.json({ id: req.params.id });
});
module.exports = router;
我注意到一些关于“嵌套文件夹结构”的评论。这是隐含的,但并不明显,所以我添加了以下部分。下面是路由的嵌套文件夹结构的一个特定示例。
index.js
/api
index.js
/admin
index.js
/users
index.js
list.js
/permissions
index.js
list.js
这更像是节点工作方式的一般示例。如果您在文件夹中使用“index.js”,就像在目录默认情况下在网页中使用“index.html”一样,这将很容易根据递归缩放您的组织,而无需将入口点更改为代码。"<-plhd--2/>"是在目录中使用要求时访问的默认文档。
索引的内容。js
const express = require('express');
const router = express.Router();
router.use('/api', require('./api'));
module.exports = router;
/api/index的内容。js
const express = require('express');
const router = express.Router();
router.use('/admin', require('./admin'));
module.exports = router;
/api/admin/index的内容。js
const express = require('express');
const router = express.Router();
router.use('/users', require('./users'));
router.use('/permissions', require('./permissions'));
module.exports = router;
/api/admin/users/index的内容。js
const express = require('express');
const router = express.Router();
router.get('/', require('./list'));
module.exports = router;
这里可能有一些干燥问题,但它确实很适合封装问题。
仅供参考,最近我进入了动作英雄,发现它是全功能的w/套接字和任务,更像一个真正的框架,在它的头上翻转REST范式。你应该去看看裸体快递。
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/jordan/item/cat
我得到一个回复:
{"user_id":"jordan","item_id":"cat"}