【问题标题】:Loopback ValidationError: The `Role` instance is not valid. Details: `name` already exists (value: "admin")Loopback ValidationError: `Role` 实例无效。详细信息:`name` 已存在(值:“admin”)
【发布时间】:2017-01-22 03:48:51
【问题描述】:

我是 loopback 的新手,但是我按照步骤安装和搭建了我的文件夹 (loopback-server),在 server/boot/ 内我创建了一个文件 script.js 并包含以下代码:

    module.exports = function(app) {
var MongoDB = app.dataSources.MongoDB;

MongoDB.automigrate('Customer', function(err) {
   if (err) throw (err);
   var Customer = app.models.Customer;

   Customer.create([
    {username: 'admin', email: 'admin@admin.com', password: 'abcdef'},
    {username: 'user', email: 'muppala@ust.hk', password: 'abcdef'}
  ], function(err, users) {
    if (err) throw (err);
     var Role = app.models.Role;
    var RoleMapping = app.models.RoleMapping;

    //create the admin role
    Role.create({
      name: 'admin'
    }, function(err, role) {
      if (err) throw (err);
       //make admin
      role.principals.create({
        principalType: RoleMapping.USER,
        principalId: users[0].id
      }, function(err, principal) {
        if (err) throw (err);
      });
    });
  });
});

};

现在我收到此错误:

我已将此文件注释掉,但没有收到该错误。顺便说一句,我尝试更改 {username: 'admin',..} 和 Role.create({name: 'admin'},..我无法以管理员身份登录。

【问题讨论】:

    标签: node.js mongodb loopback baasbox


    【解决方案1】:

    如果您的 Role 实体存储在数据库中,那么此代码将在您的应用程序每次启动时尝试创建该角色实体(名称为 "admin")。但是,在第一次之后,该角色已经存在,因此您会收到一个错误,即您有一个重复的“名称”。您可能想要做的是检查角色不存在,或者不将角色存储在您的数据库中。

    您可以添加一些代码来检查当前数据库,并且仅在该角色不存在时才添加该角色。像这样的:

    Role.find({ name: 'admin' }, function(err, results) {
        if (err) { /* handle this! */ }
    
        if (results.length < 1) {
            // now we know the DB doesn't have it already, so do the Role creation...
        }
    });
    

    请注意,您还需要检查该角色表是否已经包含您要添加的主体,并且仅在它们不存在时才添加它们。

    【讨论】:

    • 谢谢你,你说的很有道理,现在我看不到错误但是..当我以管理员身份登录并使用令牌进行 GET 请求时,它给了我这个错误:“错误”: {“名称”:“错误”,“状态”:401,“消息”:“需要授权”,“状态代码”:401,“代码”:“AUTHORIZATION_REQUIRED”,
    • 请你能多解释一下(如果你的角色实体被存储在数据库中,那么这段代码会尝试创建该角色实体(名称为“admin”)每次你应用程序启动。)顺便说一下,在启动服务器之前我有一个空数据库
    • 授权错误完全取决于您尝试执行的操作以及您在模型上使用的 ACL。至于我的文字的解释,我不知道还能怎么说...如果您的Roles 存储在数据库中,那么您无法在每次应用程序启动时重新创建它们(这就是启动脚本)。
    • 很清楚,但是我所说的在启动服务器之前清空我的数据,是否表明角色没有存储在数据库中?对不起,如果你觉得这听起来很傻。
    • 对不起,我只是不确定。它可能是?查看您的 model-config.json 文件并查看 Role 实体设置为哪个数据源 - 这应该表明角色是否正在存储。
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2016-08-14
    • 2021-04-25
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多