Meteor collection fetch返回空数组,但已订阅

Meteor collection fetch返回空数组,但已订阅,meteor,publish-subscribe,meteor-collections,Meteor,Publish Subscribe,Meteor Collections,我卸载了自动订阅并重新启动了meteor应用程序。从那以后,我一直无法访问客户端上的收集数据 与空数组返回相关的每个问题都给出了相同的答案:订阅的数据还不可用。但无论我等待多久,我都看不到客户机上的数据 服务器: Meteor.startup(function () { Meteor.publish("states", function () { return states.find(); }); }); 在服务器上记录states.find().fetch()会按预期显示我的

我卸载了自动订阅并重新启动了meteor应用程序。从那以后,我一直无法访问客户端上的收集数据

与空数组返回相关的每个问题都给出了相同的答案:订阅的数据还不可用。但无论我等待多久,我都看不到客户机上的数据

服务器:

Meteor.startup(function () {
  Meteor.publish("states", function () {
    return states.find();
  });
});
在服务器上记录
states.find().fetch()
会按预期显示我的状态

在客户机上:

Meteor.subscribe("states", function(){
  console.log(states, states.find(), states.find().fetch());
});
states
states.find()
按预期返回对象,
.fetch()
返回一个
[]

等待(甚至几分钟),然后在浏览器控制台中运行
states.find().fetch()
,我会感到
[]

想法

编辑

集合在isServer/isClient块之外声明(以利用模式)


我认为您得到的是
[]
,因为您是在启动时发布数据的,如果还没有准备好,让我们让订阅成为被动的

Tracker.autorun(function(){
   Meteor.subscribe("states", function(){
      console.log(states, states.find(), states.find().fetch());
   });
});
可选

没有理由在
isServer/isClient
if语句中声明集合

因为您是从良好实践开始的(删除
unsecure/autopublish
packages)

让我们做下面的事情

首先创建文件夹结构。(检查并确认这一点)

appName/lib/collection.js中放置此代码

states = new Meteor.Collection("states");
//optional you can place this subscribe inside the appName/client/main.js
if(Meteor.isClient){
   Meteor.subscribe("states", function(){
      console.log(states, states.find(), states.find().fetch());
   });
}
appName/server/publish.js上

Meteor.publish("states", function () {
    return states.find();
  });

您是如何申报您的收藏的?@BrendanTurner添加到op
Meteor.publish("states", function () {
    return states.find();
  });