2016-04-26 104 views
3

我正在從定製用戶權限管理系統遷移到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種方法可以解決這個問題,但沒有人感到滿意:

  • 的最佳人選:反規範化和重複。我將我的membersadmins字段保留在組文檔中。讓我感到困擾的是,我將保留同一事物的兩個版本,並且會出現不一致的可能性。

  • 向發佈中添加一個參數並使用此參數重新運行它(例如userGroupsAsMember),但它依賴於客戶端並使其發送不必要的信息。

  • 直接使用低級別發佈API或使用package。我已經直接在過去做過,但我不想再依賴Cursor.observe(),因爲它不能有效擴展並創建不必要的服務器負載。

我是否錯過了一個選項?如果不是,那麼讓我的出版物保持反應的最好方法是什麼?

回答

2

使用reywood:publish-composite創建反應式連接。

Meteor.publishComposite("my-groups", { 
    find: function() { 
     // findOne won't work, it's not a cursor 
     return Meteor.users.find(
     {_id: this.userId}, 
     {fields: {roles: 1}} 
    ); 
    }, 
    children: [{ 
    find: function(user) { 
     // getPartitionsForUser allows the first parameter to be the actual user object. 
     const userGroupsAsAdmin = Roles.getPartitionsForUser (user, ['group_admin']); 
     const userGroupsAsMember = Roles.getPartitionsForUser (user, ['member']); 
     const selector = {$or:[{'_id':{$in: userGroupsAsMember}},{'_id':{$in: userGroupsAsAdmin}}]}; 
     const options = {}; 
     const response = Groups.find(selector, options); 
     return response; 
    } 
    }] 
}); 

Roles.getPartitionsForUser不返回遊標,因此它不能被動。這就是爲什麼您還需要發佈Meteor.users.find電話。

+0

謝謝你的回答。這將匹配我的第三個選項,即使用'Cursor.observe()'。這是不太理想的選擇,因爲每個服務器都必須觀察,如果我有許多用戶在線,它將最終成爲一個大負載(而其他兩個選項則相反)。你有什麼理由比其他兩個人更喜歡這個嗎?請注意,我的應用程序應該工作在一個相當大的規模。 – Billybobbonnet

+0

我猜想在這種情況下觀察遊標不會導致巨大的負載,因爲Meteor.users不會經常更改,並且相關部分仍然保留在內存中。我想,觀察'組'會佔用更多的資源。但顯然這只是一個沒有確鑿證據的預感。 – aedm

+0

我希望我能找到一個非規範化與遊標觀察方法的真實生活數據比較。 – Billybobbonnet

相關問題