为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2022-01-01 20:44:38
我正在尝试使用Joi验证其键应与外部对象匹配的另一个键,其值为数组的嵌套对象我尝试使用object.pattern和array.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] ] } }如何在没有硬编码密钥的情况下进行此验证?
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-01-01
  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信