34

我想对所有用户的特定字段集进行客户端访问,而我希望仅对当前用户访问更多字段。我该如何编写发布代码来完成此任务?

4

3 回答 3

48

Right from Meteor documentation:

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

And also:

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

Hope this helps.

于 2012-10-31T05:50:53.207 回答
33

如上所述,

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}});
});

发布函数将从用户集合中推送数据。

订阅

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

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

于 2013-01-04T04:02:13.133 回答
5

我的故事:我按照文档所述进行,但遇到了奇怪的行为。我有发布功能,在这里我为当前用户(比如说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.userIduserIdfrom 参数替换。

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

// 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()并将 systemData 添加到配置文件对象旁边,而不是配置文件中。我的其他问题开始了 :) 请参阅Meteor.loginWithPassword 回调未在用户帐户文档中提供自定义对象

PS:如果我一开始就知道,我已经将 systemData 对象放入特殊集合中。

于 2014-01-25T02:25:16.683 回答