【问题标题】:Meteor publish/subscribe issue流星发布/订阅问题
【发布时间】:2015-12-27 11:34:53
【问题描述】:

我显然不了解发布/订阅系统。

我删除了不安全/自动发布的包。

在我的 server/publish.js 我有:

Meteor.publish("profiles", function () {
    return Meteor.users.find({}, {
        profile: 1,
        status: 1,
        services: 0
    });
});

在我的 client/lib/collection.js 我有:

Meteor.subscribe("profiles");
Profiles = new Mongo.Collection("profiles");

现在,我期望在客户端上有一个 Profiles 集合,它只包含用户文档的配置文件和状态部分,不包含服务部分(其中包含电子邮件等证明信息)。

但是,在客户端,Profiles 集合是空的,而 Meteor.users() 是可用的并且其中包含所有内容,因此知道如何打开控制台的任何人都可以看到有关所有用户的私人数据...

有人知道我在这里做错了什么吗?

编辑:有趣的是,当我完全删除发布配置文件时,在客户端 Meteor.users 中只有当前用户,并且只有 profile 部分。现在我完全糊涂了。

【问题讨论】:

  • 如果用户已登录,无论发生什么情况,数据都会发布到客户端(仅该用户的数据)。您的发布方法按预期工作。简而言之,用户自己的数据是由流星自动发布的。
  • 我不明白你的回答?你读过我的问题吗?当 a) 客户端上的 Profiles 集合为空并且 b) 客户端上的 Meteor.users() 集合具有所有客户端及其私有数据时,我的发布如何正常工作?
  • Meteor.users().find() 返回客户端订阅的文档。如果您删除自动发布,则通常不会获取数据。您可能有一些其他代码负责。
  • 说真的,我不知道你在说什么......
  • 好吧,也许我没能解释你的问题。请原谅我这些irrelevant suggestions

标签: meteor


【解决方案1】:

UPS,Meteor .find 语法与标准 mongodb .find 语法略有不同。我需要添加 "fileds" 关键字,然后它按预期工作。

几乎,因为我的个人资料集合在客户端上仍然是空的......?

Meteor.publish("profiles", function () {
    return Meteor.users.find({}, {
        fields: {
            "services": 0
        }
    });
});

编辑:好的,感谢 Thai Tran,我终于意识到我确实误解了发布/订阅系统。我错误地认为服务器上的发布“名称”将是客户端上的集合名称。现在我了解了它的工作原理,很清楚为什么我的 Profiles 集合是空的。

【讨论】:

  • 您的个人资料收藏与您的用户收藏没有任何关系。这是 2 个完全不同的系列。当您发布数据时,根集合将在客户端可用,就像在用户集合中一样。如果您想在系统中拥有配置文件集合,则需要更改保存用户和配置文件的方式(如旧数据库设计中的一对多关系),然后根据用户 ID 发布配置文件集合
  • 我想我终于明白了。我的错误印象是发布“名称”部分定义了在客户端使用的集合名称,但我现在明白了我是如何以及为什么有错误的想法。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 2015-05-15
  • 1970-01-01
  • 2018-12-18
  • 2018-12-26
相关资源
最近更新 更多