![](/img/trans.png)
[英]Joi validate array of objects, such that only one object has specific property
[英]JOI validate if array has only single matching item. Not more than one
例如 arrays :
const first = {
class: 'XYZ',
people: [{
id: 1,
name: "John",
isCreator: false
}, {
id: 2,
name: "Alex",
isCreator: true
}]
};
const second = {
class: 'XYZ',
people: [{
id: 1,
name: "John",
isCreator: false
}, {
id: 2,
name: "Alex",
isCreator: false
}]
};
const third = {
class: 'XYZ',
people: [{
id: 1,
name: "John",
isCreator: true
}, {
id: 2,
name: "Alex",
isCreator: true
}]
};
我想驗證people
數組中必須有一個創建者( isCreator: true
),但只有一個,不能更多
我的架構如下所示:
const schema = Joi.object().keys({
class: Joi.string().required(),
people: Joi.array().items(
Joi.object().keys({
id: Joi.number().integer().positive().required(),
name: Joi.string().alphanum().required(),
isCreator: Joi.boolean().required()
})
).min(2)
.has(Joi.object().keys({
id: Joi.number(),
name: Joi.string(),
isCreator: Joi.valid(true) // <-- this
})).required()
});
schema.validate(first);
schema.validate(second);
schema.validate(third);
但
您可以使用unique並比較您的isCreator
字段:
Joi.object().keys({
class: Joi.string().required(),
people: Joi.array().items(
Joi.object().keys({
id: Joi.number().integer().positive().required(),
name: Joi.string().alphanum().required(),
isCreator: Joi.boolean()
})
).unique((a, b) => a.isCreator !== false)
})
這樣,您只能擁有一個isCreator=true
的 object 。
如果您發送此 object:
{
class: 'XYZ',
people: [{
id: 1,
name: "John",
isCreator: false
}, {
id: 2,
name: "Alex",
isCreator: true
},{
id: 3,
name: "Math",
isCreator: true
}]
}
您將收到以下錯誤:
Validation Error: "people[2]" contains a duplicate value
我在soltex 的幫助下找到了答案。 必須做一些修改:
const schema = Joi.object().keys({
class: Joi.string().required(),
people: Joi.array().items(
Joi.object().keys({
id: Joi.number().integer().positive().required(),
name: Joi.string().alphanum().required(),
isCreator: Joi.boolean().required()
})
)
// re-added this part
.has(Joi.object().keys({
id: Joi.number(),
name: Joi.string(),
isCreator: Joi.valid(true)
}))
.unique((a, b) =>
a.isCreator !== false /* also added this --> */ && b.isCreator == a.isCreator
)
});
現在所有可能的測試用例都完全按要求工作。 感謝@soltex 的幫助
people: [{..., isCreator: false}, {..., isCreator: false}, {..., isCreator: false}]
// is returning error "people" does not contain at least one required match 👍
people: [{..., isCreator: true}, {..., isCreator: false}, {..., isCreator: true}]
// is returning error "people[2]" contains a duplicate value 👍
people: [{..., isCreator: true}, {..., isCreator: false}, {..., isCreator: false}]
people: [{..., isCreator: false}, {..., isCreator: true}, {..., isCreator: false}]
// are passing successfully 👍
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.