具有参数验证的ExpressJS嵌套路由

时间:2017-08-25 08:40:32

标签: javascript node.js express

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

我的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。

有没有办法实现为父路由以及所有嵌套路由评估参数?

谢谢你, 斯蒂芬

1 个答案:

答案 0 :(得分:1)

这看起来像是对嵌套路由器如何工作的误解。在您的示例中,您似乎希望在roomroutemessageroute之间共享一个参数,但是,这两个路由器彼此没有任何关系。

路由器在作为中间件提供给另一台路由器时会嵌套 - 你已经有了一个例子.... 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', ...);