使用Meteor设置管理员帐户以查看所有任务

时间:2017-06-24 22:27:25

标签: javascript html meteor meteor-accounts alanning-roles

我是Meteor的新手,刚刚浏览了此处提供的待办事项列表教程(https://www.meteor.com/tutorials/blaze/creating-an-app)。我删除了自动发布并设置了显示功能,使所有任务都是私有的(也就是说,用户只能看到自己的任务。)

现在,我想将其更改并将一个帐户设置为管理员帐户。管理员可以查看每个人的任务,但没有其他人可以看到任何内容(甚至不是他们自己的任务)。我正在尝试使用我已经在app文件夹中下载的alanning-roles包来完成此操作。

在我的tasks.js文件中,我插入了行:

const mod = 'E9Y4qtFXK2qQGAGq3'; // this is the userId of the account that I wish to make admin
Roles.addUsersToRoles(mod, 'moderator');

然后,我不是只显示所有任务,而是附上命令以显示if语句中的所有任务:

if (Meteor.isServer) {
  if (Roles.userIsInRole(this.userId,'moderator')) {
     Meteor.publish('tasks', function tasksPublication() {
     return Tasks.find();
    });
  }
}

如果您以管理员/管理员身份登录,则应显示所有任务,否则不显示任何内容。但是当我运行此代码时,即使我以管理员身份登录,也不会显示任何任务。我确定我设置的userId是正确的,并且集合中有任务。有没有人对这个问题有什么想法?

(或者,关于如何做到这一点的任何其他建议?不必使用alanning-roles - 我只是认为这将是最简单的)

非常感谢 -C

编辑:如果我在行中用“mod”替换“this.userId”:

if (Roles.userIsInRole(this.userId,'moderator')){...}

然后显示所有任务。所以看来问题出在this.userId。

的输出上

2 个答案:

答案 0 :(得分:0)

您应该使用Meteor.userId()而不是this.userId:

if (Meteor.isServer) {
  if (Roles.userIsInRole(Meteor.userId(),'moderator')) {
   Meteor.publish('tasks', function tasksPublication() {
     return Tasks.find();
    });
  }
}

根据经验,总是使用Meteor.userId(),除了在出版物中,你应该使用this.userId

答案 1 :(得分:0)

您需要移动到您检查当前用户是否是“主持人”的位置。在发布函数内部:

目前在您的代码中,当您访问this.userId服务器正在启动时,this.userId将为undefined。因此,if语句中的代码未被执行,因此未创建publish函数,并且没有客户端可以订阅此数据。

试试这个:

if (Meteor.isServer) {
    Meteor.publish('tasks', function tasksPublication() {
        if (Roles.userIsInRole(this.userId, 'moderator')) {
            return Tasks.find({});
        } 
  });
}

现在,在启动时,Meteor.isServer块运行,创建tasks发布,并使用代码检查其中的角色。现在每次客户端订阅此函数时都会调用此函数,在此上下文中this.userId将是当前客户端的用户ID。

此外,请勿将alanning-roles包的源代码放入应用程序的文件夹中 - 通过运行meteor add alanning:roles或通过npm {{1}来包含该包}}