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

Posted

技术标签:

【中文标题】Meteor 集合获取返回空数组但已订阅【英文标题】:Meteor collection fetch returns empty array but is subscribed 【发布时间】:2015-05-07 13:53:55 【问题描述】:

我卸载了自动订阅并重新启动了流星应用程序。从那时起,我就无法在客户端访问我的收藏数据。

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

服务器:

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());
);

statesstates.find() 按预期返回对象,.fetch() 返回 []

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

想法?

编辑

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

states = new Meteor.Collection("states");

【问题讨论】:

你是如何申报你的收藏的? @BrendanTurner 添加到操作 【参考方案1】:

我认为您收到 [] 是因为您在启动时发布数据,当尚未准备好时,让该订阅成为响应式。

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

可选

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

因为您从良好做法开始(删除 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());
   );

appName/server/publish.js

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

【讨论】:

以上是关于Meteor 集合获取返回空数组但已订阅的主要内容,如果未能解决你的问题,请参考以下文章

Meteor JS如何从集合中的数组中获取特定对象?

如何将所有 Meteor Mongo 集合名称检索为 Javascript 数组?

如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?

Java中应该返回零长度数组或空集合,而不是返回null(转)

MeteorJS - 如何防止匿名客户端订阅集合?

angular-meteor 根据参数查找 MongoDb 集合并返回