Collections 订阅从不使用iron路由器填充Meteor集合

Collections 订阅从不使用iron路由器填充Meteor集合,collections,meteor,publish-subscribe,iron-router,Collections,Meteor,Publish Subscribe,Iron Router,在这里,我有一个Meteor集合和一些subscribe调用,这些调用应该用服务器发布的至少一条记录来填充它。此外,还有iron routerwait()调用。但是,集合从未填充。服务器确实发送了该记录,因为客户端事先订阅的另一个集合收到了该记录 问题是,万一它被证明是一个bug。我认为可能有两个问题 第一种情况是,已发布的数据最终在客户机上的集合Books。这是它在服务器上的集合,如果发布返回游标,它将在客户端上结束。仔细查看文档中的“按房间计数”示例,了解发布-订阅名称如何匹配,但集合名称需

在这里,我有一个Meteor集合和一些
subscribe
调用,这些调用应该用服务器发布的至少一条记录来填充它。此外,还有iron router
wait()
调用。但是,集合从未填充。服务器确实发送了该记录,因为客户端事先订阅的另一个集合收到了该记录


问题是,万一它被证明是一个bug。

我认为可能有两个问题

第一种情况是,已发布的数据最终在客户机上的集合
Books
。这是它在服务器上的集合,如果发布返回游标,它将在客户端上结束。仔细查看文档中的“按房间计数”示例,了解发布-订阅名称如何匹配,但集合名称需要使用自定义的“added()、remove()、changed()块进行设置,以管理客户端上与服务器上不同名称的集合

第二个问题是如何检查客户机上的数据。Iron路由器等待订阅句柄的ready()返回true。但这一事实只意味着服务器已经发送了所有数据。从就绪()上的文档中—“如果服务器已将订阅标记为就绪,则为True。反应式数据源。”

因此,服务器已经发送了所有数据,但它可能还不在客户机上。因此,您始终需要检查所需的数据是否存在,并且永远不要仅仅因为订阅已就绪()就假定所有数据都已到达

尝试将此添加到客户端代码:

Deps.autorun( function(){
   // replace this.params.name with the name because it is no longer in scope
   console.log( Books.findOne( {name: this.params.name} )); 

});

我想在订阅准备好后,它会记录您正在查找的数据。

这不是预期的行为吗?它将再次运行,以便检查.wait()以查看订阅是否完成。数据类型的东西(窥视集合)进入
data
键,除非有反应性的更改,否则它不会再次运行。你能在代码中包含一个例子吗?@hharnisc:我在问题的第一行链接到了回购协议?关于第一个问题-确切地说,客户端和服务器上的集合名称必须匹配。我刚刚花了一两个小时写了这个答案,并且意识到了同样的事情。