我不确定这是否是对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的限制还是我实现了这个错误?
答案 0 :(得分:2)
这不是特定于React的问题,它是findOne
工作方式的结果。如果您的客户端Supplier
集合中有一个或多个文档,Supplier.findOne()
只会获取第一条记录,而不会引用您刚从订阅中提取的文档。
这意味着(a)由于其他预先存在的订阅,您在客户端有多个供应商,或者(b)您从handle
订阅中返回多个供应商。
在handle
订阅之前检查客户端集合的状态。如果有1个或多个文档且这是您的应用程序的预期状态,请修改客户端findOne以添加{_id: user.active}
之前的版本。