我想对路由和所有嵌套路由的特定参数的请求执行一些验证和添加。
我的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);
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。
有没有办法实现为父路由以及所有嵌套路由评估参数?
谢谢你, 斯蒂芬
答案 0 :(得分:1)
这看起来像是对嵌套路由器如何工作的误解。在您的示例中,您似乎希望在roomroute
和messageroute
之间共享一个参数,但是,这两个路由器彼此没有任何关系。
路由器在作为中间件提供给另一台路由器时会嵌套 - 你已经有了一个例子.... app
本身就是一个路由器,你嵌套roomroute
和{{ 1}}进入它。因此,根据您当前的设置,如果您希望在这两条路线上共享messageroute
,则需要在param('room')
级别配置它,即
<强> main.js 强>
app
<强> roomroute.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);
<强> messageroute.js 强>
const router = express.Router({ mergeParams: true });
router.get('/:room', ...);