使用字符串参数问题

时间:2017-12-09 16:42:44

标签: meteor

我正在尝试传递一个对象{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的新手,并试图遵循现有代码,但这似乎并不正确。有没有更好的方法来改进代码并实现相同的目标?

任何建议或想法都受到高度赞赏。

我确实通过流星文档,但他们似乎没有我的场景的例子,所以我希望有人可以帮助我:)干杯!

1 个答案:

答案 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集合无关。