如何根据网址参数限制Meteor.publish()?

时间:2019-07-09 11:47:39

标签: node.js meteor

我是Meteor和服务器端Java语言的新手。我一直陷在一个看似微不足道的问题上:我想根据路径或查询字符串来限制服务器发布的数据。例如,当访问foo.com/cars/123时,我希望“汽车”集合仅包含汽车“ 123”的记录。

我在调用Meteor.publish()的服务器端代码中找不到访问完整URL的方法。

我首先尝试寻找一些包含完整URL的变量,然后解析它。我只能找到Meteor.absoluteUrl(),它仅包含协议,主机和端口,但是路径和查询字符串被剥离。

我尝试创建可以捕获url参数的路由,但是当我将Meteor.publish放置在route函数中时,没有数据被发布。当我在路由器中捕获参数值,将其保存为全局值,然后在发布时使用它时,这种方法可以工作:

// main.js

Meteor.startup(() => {
  WebApp.connectHandlers.use("/", function(req, res, next) {
    const params = require('url').parse(req.url, true).query;
    global.carId = params['carId'];

    next();
  });

});

// cars.js

export default CarData = new Mongo.Collection('car-data');

if (Meteor.isServer) {
    Meteor.publish('carData', function tasksPublication() {
        return CarData.find({id: global.carId || 'demo'});
    });
}

但是,它不适用于并行请求,我需要改用请求范围的变量,但我也无法弄清楚。

最后,我考虑将全局变量替换为由Meteor.connection._lastSessionId索引的全局映射,但感觉不像是一个可靠的解决方案。

感谢您的提示!

编辑:我找到的解决方案

// cars.js

export default CarData = new Mongo.Collection('car-data');

if (Meteor.isServer) {
    Meteor.publish('carData', carId) => {
        return CarData.find({id: carId});
    });
}

// frontend

const urlParams = new URLSearchParams(window.location.search);
const flowId = urlParams.get("carId");
Meteor.subscribe('carData', carId);

0 个答案:

没有答案