我是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);