【发布时间】:2012-10-20 13:16:31
【问题描述】:
我希望所有用户都可以在客户端访问某些字段,而我希望仅为当前用户访问更多字段。我该如何编写发布代码来完成此任务?
【问题讨论】:
-
来过一次,我不清楚答案。然后我偶然发现了一个答案,它阐明了集合、发布、订阅等之间的关系。stackoverflow.com/a/21853298/1429390 那么这里的答案就更清楚了。
标签: meteor
我希望所有用户都可以在客户端访问某些字段,而我希望仅为当前用户访问更多字段。我该如何编写发布代码来完成此任务?
【问题讨论】:
标签: meteor
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}});
});
希望这会有所帮助。
【讨论】:
subscribe 那个 userData 但我很难过。可能是因为我对流星的概念没有牢牢把握。客户端应该怎么设置?
如上所述,
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() 对象中可用。
【讨论】:
autosubscribe 一点。是否已弃用?
我的故事:
我按照文档所述进行操作,但遇到了奇怪的行为。
我有发布功能,在这里我为当前用户发布了整个配置文件和电子邮件对象(比如说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 对象放入了特殊的集合中。
【讨论】: