3

我正在尝试根据用户的角色有选择地发布用户数据。我想要发布电子邮件地址和用户名。如果用户是管理员,他们应该能够看到整个用户配置文件。

在服务器 (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 的错误还是我从根本上误解了登录/注销?

更新

我读了更多,似乎 Meteor 会随机选择同一集合上的多个订阅/发布的数据。考虑到这一点,我将返回查询更改为:

Meteor.users.find _id: $ne: @userId, fields: data

其他用户的数据现在没有公布!(控制台中的 Meteor.users.find().count() 返回 1。)

4

1 回答 1

0

我相信您的原始退货声明很好。但是,我会看看你的Roles.userIsInRole函数在@userIdis时会发生什么null。也许那里有一个错误导致发布功能崩溃。

我不是 Coffeescripter,但如果这是问题所在,那么我认为将其添加到 Publish 函数的顶部将解决您的问题:

if not @userId return
于 2013-04-09T14:14:51.423 回答