Meteor中基于登录用户“角色”的动态发布

时间:2014-10-03 00:49:00

标签: meteor meteor-publications meteor-accounts

我希望有一些出版物只根据用户的角色返回用户有权访问的项目。我正在使用alanning:roles包来处理角色。

例如,我有一个类似的出版物:

Meteor.publish('header_fields', function() {
    console.log("header_fields: %j", this.userId);
    if (Roles.userIsInRole(this.userId,['ADMIN','INSPECTOR'])) {
        // Inspectors and Admins can see all header fields
        return HeaderFields.find();
    } else {
        // Clients should only be able to see header fields for forms they have access to
        var user = Meteor.users.find({_id: this.userId});
        var formIds = [];
        _.each(Forms.find({client_id: user.profile.client_id}).fetch(), function(form) {
            this.push(form._id);
        }, formIds);
        return HeaderFields.find({form_id: {$in: formIds}});
    }
});

我遇到的问题是,在我看到的所有示例中,发布都在服务器文件夹中的.js文件中定义,因此在客户端首次连接时运行并获取。但是,当客户端最初连接时,用户尚未登录。但是,我不知道在哪里放这些出版物或它应该如何运作。

1 个答案:

答案 0 :(得分:3)

Meteor默认以优雅的方式处理这个特殊用例,引用官方文档:

  

<强> this.userId

     
    

访问发布功能。登录用户的id,如果没有用户登录,则为null。这是常量。     但是,如果登录用户更改,则重新运行发布功能     用新的价值。

  

http://docs.meteor.com/#publish_userId

所以基本上它意味着如果你在客户端订阅了一个基于this.userId返回不同文档的出版物,就像你的例子一样,一切都应该是开箱即用的!