Joi对象验证:如何验证具有未知密钥名称的值?

时间:2017-01-19 12:17:26

标签: validation hapijs joi

我有一个我不可能知道的关键名称的对象 - 它们是由用户创建的。但是我确实知道它们(键)将要存储的值,并且它们(值)将成为ISO字符串。如何验证这些值?并且,可选,如何验证未知对象的密钥,即:

 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 个答案:

答案 0 :(得分:13)

试试这个。它基本上接受对象campaign中的任何键,并且该值必须针对Joi.date().iso()进行验证

campaign: Joi.object().pattern(/^/, Joi.date().iso())

然而,这将匹配任何键。你可以通过填充正则表达式来限制它。例如只有2到25个字符之间的单词字符

campaign: Joi.object().pattern(/\w{2,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的值可以是{{1}之一}和'firstname', 'lastname', 'title', 'company', 'jobtitle'只是一个字符串。

value

但是,它还允许对象具有属性{ arg: 'firstname', value: 'john' } { arg: 'lastname', value: 'smith' } { arg: 'jobtitle', value: 'brewer' } firstname,其中两个值都是一个包含两个以上字符的字符串。因此,上面的例子可以压缩成一个有效的对象。

lastname