首页 > 解决方案 > 在 loopback4 模型的属性中强制执行唯一性

问题描述

我开始使用 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

解决方案


由于github 上的这个问题,lb4 已经使用索引和 mongoDB 的 11000 错误代码检查其上下文中的重复项(我说的是购物示例,不是一个简单的lb4 app所以要注意!如果你愿意,你可以使用下面的描述来实现唯一性) . 我忘记做的是数据库迁移‍。
您可以使用此命令进行数据库迁移:
npm run migrate
所以完整的答案应该是这样的:
1-在模型内添加:(将 uniqueEmail 和 email 更改为您想要唯一的属性名称)

@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

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


推荐阅读