Meteor:已创建集合但返回为空

时间:2013-06-16 13:56:28

标签: meteor

我有这个简单的代码,基本上是尝试从头开始重新创建Players示例。我用一行

创建了一个项目
meteor create simpl

并拥有此代码

Players = new Meteor.Collection("players");

if (Meteor.isClient) {
  Meteor.startup(function () {
    console.log(Players.find().count());
  });


if (Meteor.isServer) {
  Meteor.startup(function () {
    if (Players.find().count() === 0) {
      Players.insert({name:"meteor"});
      Players.insert({name:"meteor1"});
    }
  });
}

控制台输出0. 排行榜示例中插入和检索的相同代码按预期工作,但不是这个。我在代码或项目创建中做错了吗?

更新

在阅读了有关在服务器上发布和在客户端上订阅的要求的一些评论和答案之后,我想问一下,为什么 Leaderboard 示例没有这样的代码,但是有效正如我所料。

3 个答案:

答案 0 :(得分:2)

Meteor是使用数据线上原理构建的。因此,当加载javascript时,仍然需要从服务器下载集合。

如果您等待一小段时间然后运行console.log(Players.find().count());它应该可以正常工作。当Deps.autorun集合发生变化时,将使用以下方法(Players)重新运行:

Tracker.autorun(function() {
    console.log(Players.find().count());
});

最初它会打印0,但是当下载数据时它会增加。

另一种选择是使用订阅回调来确定何时从服务器下载了所有数据。

答案 1 :(得分:2)

排行榜示例附带自动发布(此处有限的文档:http://docs.meteor.com/#dataandsecurity)。 Autopublish本质上为所有客户端的所有数据进行全局发布 - 订阅。这不安全,但这就是Leaderboard示例没有发布或订阅功能的原因

答案 2 :(得分:0)

您需要发布收集服务器端,然后订阅客户端

检查流星文档