我正在创建一个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模型,但我想以文档方式进行。
答案 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
})

其中user
是Member
的实例。
答案 1 :(得分:0)
这是一个老问题,但我遇到了同样的问题,并且能够通过使用 Antonio Trapani 建议的关系并访问这样的角色来解决它:
const userInstance = await User.findById(userId);
const roles = await userInstance.roles.find();
角色不是一个函数,它是一个对象。顺便说一下,这是使用环回 3。