loopback4 - 在 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)?
解决方案
由于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
这个答案现在是一个通用答案,可用于任何模型的任何属性。希望这可以帮助。
推荐阅读
- geolocation - 在缩放的墨卡托投影上将屏幕坐标转换为纬度/经度的方程式是什么?
- php - Eloquent:基于访问者属性的查询
- javascript - 元素移动以随机移动到列表中的预先确定的位置
- angular - 找不到模块工具提示-基本
- android - 调用 append 后 Textwacher 循环
- django - 这是一个删除对象的小函数。我想问一下,即使实例被删除,instance.get_another_url() 是如何工作的?
- android - 为什么 Android 8.1 看不到资源?
- bash - sed:当前一个输出为空时执行替代命令
- java - 如何使用线条填充三角形?
- java - Maven 验证命令有什么作用?