Meteor集合提取返回空数组但已订阅

Ran*_*all 0 publish-subscribe meteor meteor-collections

我卸载了自动订阅并重新启动了流星应用程序.从那以后,我无法在客户端访问我的收集数据.

与空数组返回相关的每个问题都会得到相同的答案:订阅的数据尚不可用.但无论我等多久,我都看不到客户端上的数据.

服务器:

Meteor.startup(function () {
  Meteor.publish("states", function () {
    return states.find();
  });
});
Run Code Online (Sandbox Code Playgroud)

登录states.find().fetch()服务器会按预期吐出我的状态.

在客户端:

Meteor.subscribe("states", function(){
  console.log(states, states.find(), states.find().fetch());
});
Run Code Online (Sandbox Code Playgroud)

states并按states.find()预期返回对象,.fetch()返回一个[].

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

思考?

编辑

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

states = new Meteor.Collection("states");
Run Code Online (Sandbox Code Playgroud)

Eth*_*aan 7

我认为你得到的[]是因为你在启动时发布了数据,当还没有准备好时,让那个订阅被动反应.

Tracker.autorun(function(){
   Meteor.subscribe("states", function(){
      console.log(states, states.find(), states.find().fetch());
   });
});
Run Code Online (Sandbox Code Playgroud)

可选的

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

因为您从良好实践开始(删除insecure/autopublish包)

让我们来做.

首先创建文件夹结构.(检查meteor/structuringyourapp和这个SO).

里面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());
   });
}
Run Code Online (Sandbox Code Playgroud)

并在 appName/server/publish.js

Meteor.publish("states", function () {
    return states.find();
  });
Run Code Online (Sandbox Code Playgroud)