0

我试图学习 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 在第一个模式中的确切用途是什么

4

1 回答 1

1

.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的键都有 value 'a'

于 2021-05-24T14:58:23.707 回答