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()keyvalue代表它的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));

要验证的对象必须包含argvalue这两个属性,其中arg的值可以是'firstname', 'lastname', 'title', 'company', 'jobtitle'之一,value只是一个字符串。


    arg: 'firstname',
    value: 'john'



    arg: 'lastname',
    value: 'smith'



    arg: 'jobtitle',
    value: 'brewer'

但是,它也允许对象具有属性firstnamelastname,其中它们的值都是包含两个以上字符的字符串。所以上面的例子可以压缩成一个有效的对象。


    firstname: 'john',
    lastname: 'smith',
    arg: 'jobtitle',
    value: 'brewer'

【讨论】:

虽然很有用,但我认为这不是很清楚,网上有一个免费使用的 Joi 验证器 [framp.me/joi-tester/]。它在 GitHub 中开源。 对于希望通过 yup 实现此目的的未来 Google 员工,请参阅此问题:github.com/jquense/yup/issues/558

以上是关于Joi 对象验证:如何验证具有未知键名的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何反序列化具有动态(数字)键名的子对象?

Joi 验证模式 - 两个字段不能具有相同的值

如何解析具有动态键名的嵌套 json

如何让我的服务器端 Joi 验证与 redux-form 一起正常工作?

如何使用 Angular 在 HTML 中访问没有键名的数组对象

Joi 验证仅返回一条错误消息