object.pattern() 在 Joi 的 array.items() 中无法正常工作

object.pattern() is not working correctly inside array.items() in Joi

我正在尝试使用 Joi
验证其键应与外部对象匹配的另一个键其值为数组的嵌套对象 我尝试使用 object.pattern and array.length which is demonstrated at

但这不适用于 array.items()

var object = {
    details:[{
        key1: 'someValue',
        key2: 'someValue',
        key3: 'someValue'
    },{
        key1: 'someValue',
        key2: 'someValue',
        key3: 'someValue'
    }],
    keys: ['key1', 'key2', 'key3']
}

var schema = Joi.object({
    keys: Joi.array().length(Joi.ref('details', {adjust: (value) => Object.keys(value).length})),
    details: Joi.array().items(Joi.object().pattern(Joi.in('keys'), Joi.string()))
})

console.log(schema.validate(object)) // this should not give error but I am getting error

我遇到错误

{ value:
   { details: [ [Object], [Object] ],
     keys: [ 'key1', 'key2', 'key3' ] },
  error:
   { ValidationError: "details[0].key1" is not allowed
     _original: { details: [Array], keys: [Array] },
     details: [ [Object] ] } }

如何在不对密钥进行硬编码的情况下使此验证工作?

Joi.ref('details', {adjust: (value) => Object.keys(value).length}),

问题 - 这里的value指的是details,它是一个数组。所以 Object.keys(<details-array>).length 不会按预期工作

解决方案 - 将 value 数组映射到 Object.keys().length 并使用下面给出的最大值


Joi.object().pattern(Joi.in('keys'), Joi.string()),

问题 - keys 指的是 details

的兄弟姐妹

解决方案 - 添加/作为对象根的前缀


var schema = Joi.object({
  details: Joi.array().items(Joi.object().pattern(Joi.in('/keys'), Joi.string())),
  keys: Joi.array().length(
    Joi.ref('details', {
      adjust: value => {
        return Math.max(...value.map(o => Object.keys(o).length));
      }
    })
  )
});

stackblitz

参考

https://github.com/hapijs/joi/blob/master/API.md#Relative-references