问题描述
我正在尝试学习 JOI 来验证模式,我遇到了以下内容
const schema = Joi.array().items(
Joi.object({
a: Joi.string(),b: Joi.number()
})
).has(Joi.object({ a: Joi.string().valid('a'),b: Joi.number() }))
我验证了方案如下let c = arr2.validate([{ a:'a',b:'b'}])
我得到的验证响应是
{
value: [ { a: 'a',b: 'b' } ],error: [Error [ValidationError]: "[0].b" must be a number] {
_original: [ [Object] ],details: [ [Object] ]
}
}
然后我尝试使用架构进行上述验证,如下所示
const arr2 = Joi.array().items(
Joi.object({
a: Joi.string(),b: Joi.number()
})
)
即使现在我得到了以下验证响应
{
value: [ { a: 'a',details: [ [Object] ]
}
}
我只是对第一个模式中 .has 的用途感到困惑,因为我可以直接获得有效值,如下所示
const arr2 = Joi.array().items(
Joi.object({
a: Joi.string().valid('a'),b: Joi.number()
})
)
那么.has 在第一个模式中的确切用途是什么
解决方法
如 .has()
文档中所述:
验证模式验证至少一个数组中的值
示例架构...
const schema = Joi.array().items(
Joi.object({
a: Joi.string(),b: Joi.number()
})
).has(Joi.object({ a: Joi.string().valid('a'),b: Joi.number() }))
...需要至少一项数组项通过验证{ a: Joi.string().valid('a'),b: Joi.number() }
例如
{ "a": "a","b": 12345 }
另一方面,您的架构...
const arr2 = Joi.array().items(
Joi.object({
a: Joi.string().valid('a'),b: Joi.number()
})
)
...将仅接受通过验证 { a: Joi.string().valid('a'),b: Joi.number() }
的项目。
第一个模式仍然会接受类似...
[
{
"a": "foo","b": 12
},{
"a": "a","b": 99
},{
"a": "bar","b": 6
}
]
...你的不会,因为并非所有 a
键都具有值 'a'
。