我想根据用户的角色有选择地发布用户数据。我想要发布电子邮件地址和用户名。如果用户是管理员,他们应该能够看到整个用户配置文件。流星发布额外的用户信息登录/注销
在服务器(CS):
Meteor.publish "allUsers", ->
if Roles.userIsInRole @userId, 'admin' then data = profile: 1
else data = 'profile.name': 1
data['emails.address'] = 1
Meteor.users.find {}, fields: data
在客户端(CS):
Meteor.subscribe("allUsers")
这个伟大的工程的大部分时间。当用户注销,然后重新登录,东西坏了与订阅和
Meteor.user().profile
回报什么。刷新页面,并重新填写配置文件字段。为了解决这个问题,我将服务器返回语句更改为:
[
Meteor.users.find {}, fields: data
Meteor.users.find @userId
]
这没有做什么。这是流星的错误还是我从根本上误解了登录/注销?
更新
我读了一点,似乎流星会随机选择多个订阅数据放在同一个收集/发表。考虑到这一点,我将返回查询更改为:
Meteor.users.find _id: $ne: @userId, fields: data
来自其他用户的数据现在不会被发布! (Meteor.users.find()。count()在控制台返回1.)
的发布功能不崩溃。当userId为null时发生的所有情况是Roles.userIsInRole返回undefined,这意味着else语句被命中。这并不能解决问题 - 匿名用户应该仍然可以访问这些信息。如果没有userId返回将意味着不会发生。即使我知道这不起作用,我检查:注销,然后再次登录(如预测)仍然留下配置文件字段未填充。感谢您的尝试。 – cazgp 2013-04-09 15:25:52
啊好吧,是的,我不确定你是否想要匿名用户获得该信息。在调用Meteor.users.find()之前,我会记录_data_的值。如果您没有服务器端调试工具设置,只需使用console.log()将输出到启动Meteor的终端(a.k.a。命令提示符)。不仅要检查值,还要确保发布函数实际上在每个操作之后被调用(登录/注销) – travellingprog 2013-04-09 15:56:49
我在调用之前已经记录了数据的值...当然,发布函数在登录/注销,这就是发生了什么!这真的不是问题的根源。这与在同一个集合中的多个订阅有关。 – cazgp 2013-04-09 16:32:55