【问题标题】:Meteor collection differs on server and client流星收集在服务器和客户端上有所不同
【发布时间】:2014-01-20 01:26:40
【问题描述】:

我有一个名为 GameMaps 的集合,定义如下:

GameMaps = new Meteor.Collection('gameMaps');

此集合中的条目如下所示:

{
  name: 'foo',
  structure: {
    arg1: 'bar',
    fields: [
      {name: 'someName', value: 'someValue'},
      {name: 'someOtherName', value: 'someOtherValue'}
    ]
  }
}

现在在服务器上,我可以通过以下方式访问结构的第一个字段:

GameMaps.findOne({name: 'foo'}).structure.fields[0]

按预期返回此对象:

{name: 'someName', value: 'someValue'}

但是当我尝试在客户端上执行相同的操作时,我得到一个空对象:

Object {}

我的收藏出版物如下所示:

Meteor.publish('allMaps', function() {
  return GameMaps.find();
});

还有这样的订阅:

Meteor.subscribe('allMaps');

在客户端上,除了“fields”数组中的对象之外,我可以看到此集合项的所有内容。我什至看到“字段”数组中的项目数量,但无法访问它们。我想我在发布收藏集时遗漏了一些东西,但我看不到什么。

【问题讨论】:

  • 如果您将名称 fields 更改为其他名称会怎样?
  • 能否也显示定义集合的代码?另外,您将订阅命令放入自动运行块中是否有原因?
  • 您如何访问这些?您是否等待订阅完成?如果你尝试在你的 js 控制台中访问它,它会不会做同样的事情?
  • @ChristianF 我相应地更新了我的问题。
  • 我也无法重现该问题 (my code)。

标签: javascript meteor


【解决方案1】:

正如您在 cmets 中确定的那样,您的问题是您有一个名为 "length" 的字段。不幸的是,如果对象具有length 属性,则序列化代码会将对象误认为是数组。

bug report

一个 hacky 解决方法是将字段重命名为 safeLengthoverrideLengthlen 甚至 langth 之类的其他名称。

【讨论】:

    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2015-02-06
    • 2015-08-07
    相关资源
    最近更新 更多