javascript - 带参数验证的 ExpressJS 嵌套路由

标签 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。

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

谢谢你, 斯特凡

最佳答案

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

当路由器作为中间件提供给另一个路由器时,它们就会被嵌套 - 你已经有一个这样的例子了....app 本身就是一个路由器,并且你嵌套了 roomroutemessageroute 到其中。因此,根据您当前的设置,如果您想在这两条路由之间共享 param('room'),您需要在 app 级别进行配置,即

ma​​in.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/

相关文章:

javascript - node.js 异步/等待与 MySQL 一起使用

node.js - 无法在 "modelRepository"构造函数的位置 #0 注入(inject)依赖项 "GetModelService"。原因 : Cannot read property 'name' of undefined

javascript - 使用 Jinja2 将 Pandas 转换为 DataTable

javascript - 计算在字符串中搜索的单词

javascript - 将点击事件绑定(bind)到指令模板内的元素

node.js - 如何更改nodejs缓存系统间的 "USER"命名空间

javascript - Google Maps API v3 Directions.route() 请求

javascript - Express js 外部 javascript 文件未加载

node.js - 将数据发送到 Express 中的前端并访问它

mysql - ExpressJS - 如何正确关闭 MySQL 连接