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

Posted

技术标签:

【中文标题】发布 Meteor.users 的某些信息和 Meteor.user 的更多信息【英文标题】:Publish certain information for Meteor.users and more information for Meteor.user 【发布时间】:2012-10-20 13:16:31 【问题描述】:

我希望所有用户都可以在客户端访问某些字段,而我希望仅为当前用户访问更多字段。我该如何编写发布代码来完成此任务?

【问题讨论】:

来过一次,我不清楚答案。然后我偶然发现了一个答案,它阐明了集合、发布、订阅等之间的关系。***.com/a/21853298/1429390 那么这里的答案就更清楚了。 【参考方案1】:

来自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);
);

希望这会有所帮助。

【讨论】:

你知道我五分钟前刚刚尝试过,但没有成功,这就是我问这个问题的原因。我又试了一次,突然它起作用了。为你点赞! 嘿,我正在尝试我的客户端 js 到 subscribe 那个 userData 但我很难过。可能是因为我对流星的概念没有牢牢把握。客户端应该怎么设置?【参考方案2】:

如上所述,

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

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

【讨论】:

Meteor 文档没有提到订阅。感谢您的提示! Meteor 文档也没有提到 autosubscribe 一点。是否已弃用? Meteor.autosubscribe 被 Meteor.autorun 和后来的 Deps.autorun 取代。我已经编辑了答案以避免混淆。 我是 Meteor 的新手,订阅后我不知道应该如何访问数据。我从 Meteor.users.find() 发布所有用户,在客户端中订阅它后,我不确定应该如何访问它。我再次尝试使用 Meteor.users.find() 但我只获得了当前用户。【参考方案3】:

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

当我有 -

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

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

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

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 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 callback doesn't provide custom object in User accounts doc

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

【讨论】:

服务器端的发布是非响应式的,服务器将根据发布时this.userId中保存的值发布数据。如果您登录,服务器端没有通知会告诉它 this.userId 已更改。出于这个原因,客户端应该在登录后重新订阅。这就是当您在 Deps.autorun 订阅范围内指定 Meteor.userId() 时反应性发生的情况,此时服务器将在 this.userId 下拥有正确的客户端 userId。

以上是关于发布 Meteor.users 的某些信息和 Meteor.user 的更多信息的主要内容,如果未能解决你的问题,请参考以下文章

使用流星列出客户端上的所有用户

Facebook 图形 API 仅返回某些网站的名称和 ID

信息记录初步了解

Easy Auth 对某些人返回空响应

在 J2ME 中,如何使用 HttpConnection 设置 Header 信息?

知道 J2ME 中的网络运营商名称