javascript - object.pattern() 在 Joi 的 array.items() 中无法正常工作
问题描述
我正在尝试使用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] ] } }
如何在没有硬编码密钥的情况下进行此验证?
解决方案
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
推荐阅读
- ios - React-native-firebase:推送通知并不总是在 iOS 上工作
- database - 如何使用碳在一个月内获得工作日期?
- swift - 销毁 UICollectionView 中的滚动视频单元格以获得类似 TikTok 的功能
- asp.net-mvc - 尝试排序时无法翻译 LINQ 表达式
- android - 有没有可以从 firestore 获取所有文档然后使用其中的数据的方法?
- bash - 如何在 crontab 中匹配正则表达式
- eclipse - 如何修复此“指定了未知版本的 Tomcat”(Windows)
- node.js - TypeError:喜欢时无法读取未定义的属性“地图”
- python - 使用 BeautifulSoup 抓取数据时返回空 DataFrame
- spring - 为 ID“null”映射的 PasswordEncoder