在 loopback4 模型的属性中强制执行唯一性

enforcing uniqueness in loopback4 model's properties

我开始使用 lb4 运行 一个简单的 hello world 项目。我使用 loopback 提供的 cli 命令为用户创建了一个基本的 mongodb 数据源、一个存储库和一个简单模型(用户名、密码和 ID)。我还创建了一个用户控制器,其中包含由 loopback 提供的内置 crud 选择。
如您所知,这是一个非常基本的设置,但如果有人需要详细信息,我会提供,只需评论即可。
问题是,当我尝试使用资源管理器创建新用户时,我遇到了重复的相同用户名模型。意思是:

{
"_id" : ObjectId("5def4581f7f9d508b0da2d4c"),
"username" : "string",
"password" : "string"
}

和:

{
"_id" : ObjectId("5def4584f7f9d508b0da2d4d"),
"username" : "string",
"password" : "string"
}

客户应输入唯一的用户名进行注册。这很明显。
如何在环回 4 中指定模型的 属性 的唯一性(不将其声明为 id)?

所以基本上我发现 Loopback4 有一个名为 name 的 属性,它是身份验证策略的唯一标识符(对于例如:'basic'、'jwt' 等)。你可以看看更详细的方式here AND here

您应该将 username 更改为 name 以满足您的要求。 因为这就是它在 loopback4

中的工作方式

由于这个 issue on github, lb4 already checks for duplicates inside of its context using indexes and 11000 error code of mongoDB (I am talking about shopping example,不是简单的 lb4 app,所以 注意! 如果您愿意,可以使用下面的描述实现唯一性)。我忘记做的是数据库迁移‍。
您可以使用此命令进行数据库迁移:
npm run migrate
所以完整的答案应该是这样的:
1- 在模型中添加:(将 uniqueEmail 和电子邮件更改为 属性 您想要唯一的名称)

@model({
    settings: {
        indexes: {
          uniqueEmail: {
            keys: {
              email: 1,
            },
            options: {
              unique: true,
            },
         },
    },
  },
})

2- 检查控制器内部,您要检查唯一性的端点,并添加一个 try catch 以捕获来自您的 mongoDB 数据源的唯一性错误:

try {
  // In my case create the new user, but can be anything you want
  const savedUser = await this.userRepository.create(
    _.omit(newUserRequest, 'password'),
  );

  // do stuff and return

} catch (error) {
  // MongoError 11000 duplicate key
  if (error.code === 11000 && error.errmsg.includes('index: uniqueEmail')) {
    throw new HttpErrors.Conflict('Email value is already taken');
  } else {
    throw error;
  }
}

3- 运行 npm run migrate

此答案现在是一个通用答案,可用于任何 属性 任何模型。 希望这有帮助。