很难理解 .has 到底对 joi 中的数组做了什么

问题描述

我正在尝试学习 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'