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

HGa*_*dhi 34 meteor

我想为所有用户提供一组特定字段的客户端访问权限,而我希望只能访问当前用户的更多字段.我如何编写发布代码来完成此任务?

jtb*_*lin 47

直接来自Meteor文档:

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

并且:

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

希望这可以帮助.

  • 嘿,我正在尝试我的客户端js"订阅"`userData`,但我很难过.也许是因为我没有牢牢掌握流星概念.我应该如何在客户端设置它? (2认同)

Jes*_*ith 32

如上所述,

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

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

发布函数将从Users集合中推送数据.

订阅

Tracker.autorun(function () {
    Meteor.subscribe("userData");
    Meteor.subscribe("allUserData");
});
Run Code Online (Sandbox Code Playgroud)

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

  • Meteor文档没有提到订阅.谢谢你的提示! (3认同)
  • Meteor docs也没有提到`autosubscribe`一点.这是否被弃用了? (2认同)

小智 5

我的故事:我按照文档说的那样进行,但遇到了奇怪的行为。我有发布功能,在那里我发布了当前用户的整个配置文件和电子邮件对象(可以说userData),以及其他用户的一些子集(allUserData)。

当我有 -

Meteor.subscribe("allUserData");
Meteor.subscribe("userData");
Run Code Online (Sandbox Code Playgroud)

在用户登录后的客户端,我只收到了allUserData数据。这意味着即使对于我登录的用户(该用户无法看到他自己的电子邮件地址)。当我刷新浏览器时,错误已修复,allUserData除已登录的用户外,所有用户都可以正常访问,该用户具有正确的userData(带有提到的电子邮件地址)。

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

Meteor.subscribe("userData");    
Meteor.subscribe("allUserData");
Run Code Online (Sandbox Code Playgroud)

放入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());
}); 
Run Code Online (Sandbox Code Playgroud)

在发布功能中,我只是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});
Run Code Online (Sandbox Code Playgroud)

无论如何,我在方法的帮助下解决了这个问题, Account.onCreateUser()并在配置文件对象旁边添加了 systemData,而不是添加到配置文件中。我的其他问题开始了 :) 请参阅Meteor.loginWithPassword 回调在用户帐户文档中不提供自定义对象

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