很难理解 .has 对 joi 中的数组的作用

Difficult to understand what exactly .has does with array in 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', b: 'b' } ],
  error: [Error [ValidationError]: "[0].b" must be a number] {
    _original: [ [Object] ],
    details: [ [Object] ]
  }
}

我只是对 .has 在第一个模式中的用途感到困惑,因为我可以直接获得有效值,如下所示

const arr2 = Joi.array().items(
  Joi.object({
    a: Joi.string().valid('a'),
    b: Joi.number()
  })
)

那么在第一个模式中服务的确切目的是什么

.has() 文档中所述:

Verifies that a schema validates at least one of the values in the array

示例模式...

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'