2016-04-26 32 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

相关问题