我正在尝试传递一个对象{key:value}并将其发送到meteor发布,以便我可以查询到数据库。
我的Mongo数据库数据库(仅限相关数据)用于产品:
products : {
categs:['Ladies Top','Gents'],
name : Apple
}
在meteor Publish中我有以下内容:
Meteor.publish('product', (query) =>{
return Clothings.find(query);
})
在客户端我使用以下内容订阅:
let query = {categs:'/ladies top/i'}; // please notice the case is lower
let subscribe = Meteor.subscribe('product',query);
if (subscribe.ready()){
clothings = Products.find(query).fetch().reverse();
let count = Products.find(query).fetch().reverse().length; // just for test
}
问题是,当我从客户端向服务器发送查询时,它会自动编码,例如:
{categs:'/ladies%top/i'}
此查询似乎根本不起作用。总共有超过20,000种产品,所有产品都不是一种选择。所以我试图根据类别(大约每个产品约100个)进行获取。
我是meteor和mongo db的新手,并试图遵循现有代码,但这似乎并不正确。有没有更好的方法来改进代码并实现相同的目标?
任何建议或想法都受到高度赞赏。
我确实通过流星文档,但他们似乎没有我的场景的例子,所以我希望有人可以帮助我:)干杯!
答案 0 :(得分:2)
首先,您尝试将正则表达式作为参数发送。这就是它被编码的原因。 Meteor不知道如何将函数或正则表达式作为参数传递。
对于此特定出版物,我建议通过您要搜索的字符串发送并在服务器上构建正则表达式:
客户端:
let categorySearch = 'ladies top';
let obj = { categorySearch }; // and any other things you want to query on.
Meteor.subscribe('productCategory',obj);
服务器:
Meteor.publish('productCategory',function(obj){
check(obj,Object);
let query = {};
if (obj.categorySearch) query.category = { $regex: `/${obj.categorySearch}/i` };
// add any other search parameters to the query object here
return Products.find(query);
});
其次,将完整的查询对象发送到发布(或方法)并不安全,因为攻击者随后可以发送任何查询。也许与您的Products
集合无关。