问题描述
这是我的 Joi 架构
const createRoom = {
body: {
createdBy: Joi.string().required(),members: Joi.array().min(2).max(2).items(
Joi.object().keys({
id: Joi.string().required(),name: Joi.string().required(),})
).unique('id').required()
}
}
我想要的是
createdBy
的值必须与成员数组中的唯一对象 ID 匹配
示例
这个输入应该通过
{
createdBy: 'abcd1234',members: [
{
id: 'abcd1234',name: "john"
},{
id: 'xyz1234',name: "john"
}
]
}
这个输入应该失败
{
createdBy: 'abcd1234',members: [
{
id: 'bcdf1234',name: "john"
}
]
}
这对 joi 有可能吗?我在 Joi Docs 中没有找到类似的内容。
解决方法
const schema = Joi.object({
createdBy: Joi.string().required(),members: Joi.array().min(2).max(2).items(
Joi.object().keys({
id: Joi.string().required(),name: Joi.string().required(),}))
.has(Joi.object({
id: Joi.string().required().valid(Joi.ref('$createdBy')),name: Joi.string()
}))
.unique('id')
})
使用 array.has 你是说你想要数组中的至少一个对象。并且 Joi.ref 允许您访问当前对象的任何值。
这意味着以下对象将通过:
const validObj = {
createdBy: 'abcd1234',members: [
{
id: 'abcd1234',name: "john"
},{
id: 'xyz1234',name: "john"
}
]
}
schema.validate(validObj,{ context: validObj })
这将失败:
const invalidObj = {
createdBy: 'abcd1234',members: [
{
id: 'xxxx',name: "john"
}
]
}
schema.validate(invalidObj,{ context: invalidObj })
这也会失败,因为有重复:
const invalidObj = {
createdBy: 'abcd1234',{
id: 'abcd1234',{ context: invalidObj })