React和Meteor订阅

时间:2016-12-02 16:10:39

标签: reactjs meteor

我不确定这是否是对React和Meteors连接的限制,因为文档表明它应该可以在没有额外参数的情况下使用。

当我在响应中调用meteor订阅时,如果我没有在查询中显式声明该参数,则返回任何数据,忽略发布函数中的指定数据。

Meteor.publish("supplier", function() {
    if(this.userId) {

       var user = Meteor.users.findOne(this.userId, { fields : { active : 1 }});
       if(user.active != this.userId || user.active != undefined){

         // This only returns 1 singular supplier - is correct
         var supplier = Supplier.find({ _id : user.active, users : this.userId });
         return supplier;

       } else {
         return this.ready();
       }
    } else {
      return this.ready();
    }
});

现在我将订阅称为响应

getMeteorData: function () {

   var data = {}

   handle = Meteor.subscribe("supplier");

    if(handle.ready()) {
      data.supplier = Supplier.findOne(); // Returns Wrong supplier
      //data.supplier = Supplier.findOne({_id: session.get("active")}) // Returns correct supplier
      data.supplierReady = true
    }

    return data;

  },

这将返回集合中的第一个供应商,而不是服务器上发布功能中登录的供应商!但是,如果我明确地通过{ _id : user.active}它就可以了!

现在我理解通过在publish函数中执行服务器上的逻辑,我可以简单地使用Supplier.findOne()但事实并非如此,我不明白为什么。这是对React / Meteor的限制还是我实现了这个错误?

1 个答案:

答案 0 :(得分:2)

这不是特定于React的问题,它是findOne工作方式的结果。如果您的客户端Supplier集合中有一个或多个文档,Supplier.findOne()只会获取第一条记录,而不会引用您刚从订阅中提取的文档。

这意味着(a)由于其他预先存在的订阅,您在客户端有多个供应商,或者(b)您从handle订阅中返回多个供应商。

handle订阅之前检查客户端集合的状态。如果有1个或多个文档且这是您的应用程序的预期状态,请修改客户端findOne以添加{_id: user.active}之前的版本。