我想对路由和所有嵌套路由的特定参数的请求执行一些验证和添加。
我的 REST 结构是/room/:room/messages
在我的 main.js 中
const roomRoute = require('roomroute.js');
const messageRoute = require('messageroute.js');
app.use('/room',roomRoute);
app.use('/room/:room/messages',messageRoute);
在 roomroute.js
const express = require('express');
const router = express.Router();
router.param('room', function (req,res,next,id) {
// Just for demo
var room = {
id: id,
title: 'Testroom'
};
req.room = room;
next();
});
router.get('/:room, function (req,res) {
// Display room to console
console.log(req.room);
res.sendStatus(200).end();
});
module.exports = router;
在messageroute.js中
const express = require('express');
const router = express.Router({ mergeParams:true });
router.get('/', function(req,res) {
console.log(req.room); // Not working
});
module.exports = router;
当我到达一个房间时,例如。/room/1234 然后 req.room 显示到控制台,这实际上是我想要的。
但是当我到达例如时。/room/1234/messages 父级的route.param('room'... 不会被执行,而只是获取messageroute.js。
有没有办法实现为父路由以及所有嵌套路由评估参数?
谢谢你, 斯特凡
最佳答案
这看起来像是对嵌套路由器工作方式的误解。在您的示例中,您似乎希望在 roomroute
和 messageroute
之间共享参数,但是,这两个路由器彼此没有关系。
当路由器作为中间件提供给另一个路由器时,它们就会被嵌套 - 你已经有一个这样的例子了....app
本身就是一个路由器,并且你嵌套了 roomroute
和 messageroute
到其中。因此,根据您当前的设置,如果您想在这两条路由之间共享 param('room')
,您需要在 app
级别进行配置,即
main.js
const roomRoute = require('roomroute.js');
const messageRoute = require('messageroute.js');
app.param('room', function (req,res,next,id) {
// Just for demo
var room = {
id: id,
title: 'Testroom'
};
req.room = room;
next();
});
app.use('/room', roomRoute);
app.use('/room/:room/messages', messageRoute);
roomroute.js
const router = express.Router({ mergeParams: true });
router.get('/:room', ...);
messageroute.js
const router = express.Router({ mergeParams: true });
router.get('/', ...);
关于javascript - 带参数验证的 ExpressJS 嵌套路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45877540/