Joi 对象验证:如何验证具有未知键名的值?
Posted
技术标签:
【中文标题】Joi 对象验证:如何验证具有未知键名的值?【英文标题】:Joi object validation: How to validate values with unknown key names? 【发布时间】:2017-06-04 03:23:49 【问题描述】:我有一个我不可能知道的键名的对象——它们是由用户创建的。但是我确实知道它们(键)将存储什么值,并且它们(值)将是 ISO 字符串。如何验证这些值?而且,可选地,我如何验证 uknown 对象的键,即:
key: Joi.string().min(2).max(25)
我已经尝试过的是基于 Joi API 文档:
使用 Joi.object([schema]) 代替普通 JS 对象的另一个好处是 >您可以在对象上设置任何选项,例如 允许未知键,例如:
const schema = Joi.object( arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), value: Joi.string(), ).pattern(/firstname|lastname/, Joi.string().min(2));
我从例子中了解到arg
键代表Joi.object()
的key
,value
代表它的value
。
我的例子:
campaign: Joi.object(
arg: Joi.string().valid( 'unknown' ),
value: Joi.date().iso(),
).pattern( /unknown/, Joi.string().min(2).max(25) )
我的意见;
campaign: g_ad_adwords: "2017-01-19T11:33:26.205Z"
我的错误:
“广告系列”失败,因为[不允许使用“g_ad_adwords”]
【问题讨论】:
【参考方案1】:试试这个。它基本上接受对象campaign
中的任何键,并且该值必须针对Joi.date().iso()
进行验证
campaign: Joi.object().pattern(/^/, Joi.date().iso())
然而,这将匹配 any 键。您可以通过稍微填充正则表达式来限制这一点。例如仅限 2 到 25 个字符之间的单词字符
campaign: Joi.object().pattern(/\w2,25/, Joi.date().iso())
更新
关于 Joi 文档中的 the example,我尚未对其进行测试,但这是我的解释。我可以理解,这不是他们可以给出的最直接的例子......
const schema = Joi.object(
arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'),
value: Joi.string(),
).pattern(/firstname|lastname/, Joi.string().min(2));
要验证的对象必须包含arg
和value
这两个属性,其中arg
的值可以是'firstname', 'lastname', 'title', 'company', 'jobtitle'
之一,value
只是一个字符串。
arg: 'firstname',
value: 'john'
arg: 'lastname',
value: 'smith'
arg: 'jobtitle',
value: 'brewer'
但是,它也允许对象具有属性firstname
和lastname
,其中它们的值都是包含两个以上字符的字符串。所以上面的例子可以压缩成一个有效的对象。
firstname: 'john',
lastname: 'smith',
arg: 'jobtitle',
value: 'brewer'
【讨论】:
虽然很有用,但我认为这不是很清楚,网上有一个免费使用的 Joi 验证器 [framp.me/joi-tester/]。它在 GitHub 中开源。 对于希望通过yup
实现此目的的未来 Google 员工,请参阅此问题:github.com/jquense/yup/issues/558以上是关于Joi 对象验证:如何验证具有未知键名的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何让我的服务器端 Joi 验证与 redux-form 一起正常工作?