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());
);
states
和 states.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 Mongo 集合名称检索为 Javascript 数组?
如何在 javascript (meteor.js) 中操作返回的 mongo 集合/游标?