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));
}
})
)
});
参考
https://github.com/hapijs/joi/blob/master/API.md#Relative-references
我正在尝试使用 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));
}
})
)
});
参考
https://github.com/hapijs/joi/blob/master/API.md#Relative-references