环回。如何获得一个用户的所有角色?

时间:2018-03-16 14:07:54

标签: javascript node.js express loopbackjs relationships

我正在创建一个Loopback应用程序,并基于内置的用户模型创建了一个自定义用户模型。

{
  "name": "user",
  "base": "User",
  "idInjection": true,
  "properties": {
    "test": {
      "type": "string",
      "required": false
    }
  },
  "validations": [],
  "acls": [],
  "methods": []
}

然后在启动脚本中创建(如果不存在)新用户,新角色和roleMapping。

User.create(
{ username: 'admin', email: 'admin@mail.com', password: 'pass' }
, function (err, users) {
    if (err) throw err;

    console.log('Created user:', users);

    //create the admin role
    Role.create({
        name: 'admin'
    }, function (err, role) {
        if (err) throw err;

        //make user an admin
        role.principals.create({
            principalType: RoleMapping.USER,
            principalId: users.id
        }, function (err, principal) {
            if (err) throw err;
            console.log(principal);
        });
    });
});

然后在自定义远程方法中,我尝试使用用户的ID获取User的所有角色。 Loopbacks' documentation on this topic

  

一旦定义了“hasMany”关系,LoopBack会自动将一个带有关系名称的方法添加到声明模型类的原型中。例如:Customer.prototype.orders(...)。

并给出了这个例子:

  

customer.orders([过滤]     function(err,orders){     ...   });

但是当我尝试使用User.roles()方法时,(const User = app.models.user;)我得到了下一个错误:

  

TypeError:User.roles不是函数

但是当我发出远程请求http://localhost:9000/api/users/5aab95a03e96b62718940bc4/roles时,我会得到所需的roleMappings数组。

所以,如果有人可以使用js来帮助获取这些数据,我将不胜感激。我知道我可能只是查询RoleMappings模型,但我想以文档方式进行。

2 个答案:

答案 0 :(得分:0)

环回文档建议extend the built-in user model 添加更多属性和功能。

一个好的做法是创建一个扩展内置模型Member的模型User。在新模型中声明以下关系:

"relations": { "roles": { "type": "hasMany", "model": "RoleMapping", "foreignKey": "principalId" } }

现在,您可以获得所有用户角色:



user.roles(function (err, roles) {
  // roles is an array of RoleMapping objects
})




其中userMember的实例。

答案 1 :(得分:0)

这是一个老问题,但我遇到了同样的问题,并且能够通过使用 Antonio Trapani 建议的关系并访问这样的角色来解决它:

const userInstance = await User.findById(userId);
const roles = await userInstance.roles.find();

角色不是一个函数,它是一个对象。顺便说一下,这是使用环回 3。