我正在從定製用戶權限管理系統遷移到Alanning:roles v2.0。我有一個非常基本的結構:我該如何保持我的出版物具有反應性?
- 基本用戶
- 用戶組,每個特定的設置。我將它們存儲在「組」集合中。
- 管理組的用戶的組管理員狀態(每個組都有其組管理員)。
我之前在「group」文檔中存儲組成員和管理員mongo _id
。通過這種方式,我可以反應性地發佈小組:我只需檢查userId
是否在組文檔中的「成員」或「管理員」字段中。
現在,我切換到Alanning強制執行的權利管理:角色,我做這樣的事情在我的刊物:
const userGroupsAsAdmin = Roles.getPartitionsForUser (this.userId, ['group_admin'])
const userGroupsAsMember = Roles.getPartitionsForUser (this.userId, ['member'])
const selector = {$or:[{'_id':{$in: userGroupsAsMember}},{'_id':{$in: userGroupsAsAdmin}}]}
const options = {}
const response = Groups.find(selector, options)
return response
注意Roles.getPartitionsForUser()
只是爲Roles.getGroupsForUser()
新的函數名。
這裏的問題在於出版物沒有注意到role
集合中的更改,因此當用戶成爲成員時,發佈不會更新。我知道this is a common issue,我知道3種方法可以解決這個問題,但沒有人感到滿意:
的最佳人選:反規範化和重複。我將我的
members
和admins
字段保留在組文檔中。讓我感到困擾的是,我將保留同一事物的兩個版本,並且會出現不一致的可能性。向發佈中添加一個參數並使用此參數重新運行它(例如
userGroupsAsMember
),但它依賴於客戶端並使其發送不必要的信息。直接使用低級別發佈API或使用package。我已經直接在過去做過,但我不想再依賴
Cursor.observe()
,因爲它不能有效擴展並創建不必要的服務器負載。
我是否錯過了一個選項?如果不是,那麼讓我的出版物保持反應的最好方法是什麼?
謝謝你的回答。這將匹配我的第三個選項,即使用'Cursor.observe()'。這是不太理想的選擇,因爲每個服務器都必須觀察,如果我有許多用戶在線,它將最終成爲一個大負載(而其他兩個選項則相反)。你有什麼理由比其他兩個人更喜歡這個嗎?請注意,我的應用程序應該工作在一個相當大的規模。 – Billybobbonnet
我猜想在這種情況下觀察遊標不會導致巨大的負載,因爲Meteor.users不會經常更改,並且相關部分仍然保留在內存中。我想,觀察'組'會佔用更多的資源。但顯然這只是一個沒有確鑿證據的預感。 – aedm
我希望我能找到一個非規範化與遊標觀察方法的真實生活數據比較。 – Billybobbonnet