我想为所有用户提供一组特定字段的客户端访问权限,而我希望只能访问当前用户的更多字段。我如何编写发布代码来实现这一目标?
答案 0 :(得分:47)
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对象放入特殊的集合中。