首页 > 解决方案 > object.pattern() 在 Joi 的 array.items() 中无法正常工作

问题描述

我正在尝试使用Joi
验证其键应与外部对象匹配的另一个键的值是数组的嵌套对象 我尝试使用object.patternarray.length这在如何验证其键应与外部对象匹配的嵌套对象使用 Joi 的值是数组的键?

但这不适用于 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] ] } }

如何在没有硬编码密钥的情况下进行此验证?

标签: javascriptjsonvalidationobjectjoi

解决方案


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));
      }
    })
  )
});

堆栈闪电战

参考

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


推荐阅读