【问题标题】:A Meteor publication or subscription returns an array of objects when it should return just one object当 Meteor 发布或订阅应该只返回一个对象时,它会返回一个对象数组
【发布时间】:2017-02-05 00:36:47
【问题描述】:

我正在尝试发布,它返回代码属性等于用户selectedGroup 的组。

Meteor.publish('selectedGroup', function () {
  return Groups.findOne({
    code: Meteor.users.findOne(this.userId).profile.selectedGroup
  })
})

订阅看起来像这样

Meteor.subscribe('selectedGroup')
return {
  group: Groups.find({}).fetch()
}

但我得到的是用户所属的所有组的数组,而不是发布应该返回的组。

即使我执行 findOne(),它也会返回第一个对象,而不是出版物应该返回的对象。

【问题讨论】:

  • 还有其他人订阅了 Groups 集合吗?
  • 这个组件有但没有。
  • 这可能很重要。如果两个订阅都处于活动状态,Meteor 将合并已发布的内容。上面的客户端 find() 不进行任何过滤,因此它会显示已发布到客户端的所有内容。
  • 我实际上是在订阅标题中的组!
  • 我该如何解决这个问题?

标签: mongodb reactjs meteor


【解决方案1】:

首先,您不应该在出版物中使用findOne - 出版物应该返回一个光标;在这种情况下,您将发布一个单文档游标(只要 Groups 中只有一个文档与查询匹配)。只需在出版物中使用find

其次,当您在客户端上获取数据时,您应该使您的查询适当地具体化。目前,您正在获取您的客户订阅的所有组(可能您有其他出版物和订阅正在运行。)有关 Meteor Guide 的建议,请参阅here。你会想在你的容器中做这样的事情:

return {
  group: Groups.findOne({
    code: Meteor.users.findOne(this.userId).profile.selectedGroup
  })
}

最后,如果您的用户的 selectedGroup 可以更改,您应该知道发布提供的数据可以更改,但他们的查询不能。因此,如果您的用户的 selectedGroup 更改,则发布不会反映这一点 - 因为它的查询不会更改。见here。所以你会想要使用reactive publish package 来处理这个问题。

【讨论】:

  • 谢谢!这很有帮助!
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多