Javascript 带参数验证的ExpressJS嵌套路由

Javascript 带参数验证的ExpressJS嵌套路由,javascript,node.js,express,Javascript,Node.js,Express,我想对路由和所有嵌套路由的特定参数执行一些验证和添加到请求中 我的休息结构是/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.j

我想对路由和所有嵌套路由的特定参数执行一些验证和添加到请求中

我的休息结构是/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,这实际上就是我想要的

但是,当我执行get to eg./room/1234/messages时,不会执行父级的route.param('room'),而只是执行messageroute.js的get

是否有办法实现对父管线和所有嵌套管线评估参数

谢谢,,
Stefan

这看起来像是对嵌套路由器工作原理的误解。在您的示例中,您似乎希望在
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);
const router = express.Router({ mergeParams: true });
router.get('/:room', ...);
const router = express.Router({ mergeParams: true });
router.get('/', ...);
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);
const router = express.Router({ mergeParams: true });
router.get('/:room', ...);
const router = express.Router({ mergeParams: true });
router.get('/', ...);
messageroute.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);
const router = express.Router({ mergeParams: true });
router.get('/:room', ...);
const router = express.Router({ mergeParams: true });
router.get('/', ...);

上面的代码是
roomroute
messageroute
的完整代码吗?我把它缩短了一点。省略const express=require('express'))还有module.exports=router。除此之外,这是完整的代码,是的。很酷,FWIW最好包含完整的代码,因为我的即时想法是你忘了导出路由器。非常感谢你,詹姆斯!