我想根據用戶的角色有選擇地發佈用戶數據。我想要發佈電子郵件地址和用戶名。如果用戶是管理員,他們應該能夠看到整個用戶配置文件。流星發佈額外的用戶信息登錄/註銷
在服務器(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