发布Meteor.users的某些信息以及Meteor.user的更多信息

时间:2012-10-31 05:42:22

标签: meteor

我想为所有用户提供一组特定字段的客户端访问权限,而我希望只能访问当前用户的更多字段。我如何编写发布代码来实现这一目标?

3 个答案:

答案 0 :(得分:47)

Meteor documentation开始:

Meteor.publish("userData", function () {
    return Meteor.users.find({_id: this.userId},
        {fields: {'other': 1, 'things': 1}});
});

还有:

Meteor.publish("allUserData", function () {
    return Meteor.users.find({}, {fields: {'nested.things': 1}});
});

希望这有帮助。

答案 1 :(得分:32)

如上所述,

Meteor.publish("userData", function () {
    return Meteor.users.find({_id: this.userId},
        {fields: {'other': 1, 'things': 1}});
});

Meteor.publish("allUserData", function () {
  return Meteor.users.find({}, {fields: {'nested.things': 1}});
});

发布函数将推送Users集合中的数据。

订阅

Tracker.autorun(function () {
    Meteor.subscribe("userData");
    Meteor.subscribe("allUserData");
});

附加数据将自动进入Users集合,并在Meteor.user()对象中可用。

答案 2 :(得分:4)

我的故事: 我按照文档说的那样继续进行,但遇到了奇怪的行为。 我有发布功能,我为当前用户发布了整个个人资料和电子邮件对象(比如userData),而其他用户只发布了一些子集(allUserData)。

当我有 -

Meteor.subscribe("allUserData");
Meteor.subscribe("userData");

在用户登录后的客户端,我只收到了allUserData个数据。这意味着即使我的登录用户(该用户无法看到他自己的电子邮件地址)。当我刷新浏览器时,修复了错误,我为所有用户正确allUserData,除了登录的用户,其中有正确的userData(提到的电子邮件地址)。

有趣的是,如果我更改了订阅的顺序,则修复了错误。:

Meteor.subscribe("userData");    
Meteor.subscribe("allUserData");

投入Meteor.autosubscribe(function () { })并没有改变任何事情。 最后,我尝试将该订阅放入Deps.autorun(function() { })并明确添加反应性,并解决序列问题..:

Deps.autorun(function() {
  Meteor.subscribe("allUserData", Meteor.userId());
  Meteor.subscribe("userData", Meteor.userId());
  // or
  // Meteor.subscribe("userData", Meteor.userId());
  // Meteor.subscribe("allUserData", Meteor.userId());
}); 

在发布功能中,我只需将this.userId替换为userId参数。

我遇到的下一个错误是,我在配置文件用户的对象中有秘密的systemData对象,只能看到管理员,而不是常规登录用户。但是,尽管使用'profile.systemData': 0的正确集合发布功能,该秘密对象可以看到所有登录用户,这些用户查看了他的个人资料对象。 可能是因为我的发布功能以某种方式干扰了Meteor账户包中的发布功能:

// Publish the current user's record to the client.
Meteor.publish(null, function() {
 if (this.userId) {
   return Meteor.users.find(
     {_id: this.userId},
     {fields: {profile: 1, username: 1, emails: 1}});
 } else {
   return null;
 }
}, /*suppress autopublish warning*/{is_auto: true});

无论如何,我在方法Account.onCreateUser()的帮助下解决了这个问题,并在profile对象旁边添加了systemData,而不是在profile中。 开始我的其他问题:)请参阅Meteor.loginWithPassword callback doesn't provide custom object in User accounts doc

PS:如果我在开始时就知道了,我将systemData对象放入特殊的集合中。