【问题标题】:Meteor: Collection created but returned emptyMeteor:集合已创建但返回为空
【发布时间】:2015-11-06 23:00:08
【问题描述】:

我有这个简单的代码,基本上是尝试从头开始重新创建 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 示例中插入和检索的相等代码按预期工作,但不是这个。我在项目的代码或创建中做错了吗?

更新:

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

【问题讨论】:

标签: meteor


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 排行榜示例中没有这样的代码,但它的行为与我描述的完全一样,它在客户端启动功能中正确检索集合。这怎么可能?
  • 如果您稍等片刻,然后在您的 JavaScript 控制台中运行 console.log(Players.find().count());,它会起作用吗?排行榜示例在服务器端有启动功能,但在客户端没有。
  • 在启动 afaik 时,客户端的排行榜示例上没有运行任何代码。你能显示你正在使用的代码吗?
  • 我自己将启动代码添加到排行榜中只是为了检查它是否有效。如果我稍后按您所说的那样记录集合,那么我确实得到了正确的计数。如果可能的话,我希望它能够像在排行榜中一样工作。或者至少知道为什么它的行为不同。
  • @MuneebMirza 以前的 Tracker 被称为 Deps。我已将答案更新为使用Tracker
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    需要先发布采集服务器端再订阅客户端

    查看流星文档

    【讨论】:

    • 再次,查看排行榜示例,源代码中没有“发布”代码,或者我忽略了它。
    猜你喜欢
    • 2015-05-07
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2014-12-03
    • 2021-07-18
    相关资源
    最近更新 更多