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

wsc*_*rge 13 validation hapijs joi

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

 key: Joi.string().min(2).max(25)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过的是基于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));

我从这个例子中理解的是,argkey表示Joi.object()'s' key,value代表它value.

我的例子:

campaign: Joi.object({
  arg: Joi.string().valid( 'unknown' ),
  value: Joi.date().iso(),
}).pattern( /unknown/, Joi.string().min(2).max(25) )
Run Code Online (Sandbox Code Playgroud)

我的意见;

campaign: { g_ad_adwords: "2017-01-19T11:33:26.205Z" }
Run Code Online (Sandbox Code Playgroud)

我的错误:

"广告系列"失败,因为["g_ad_adwords"不允许]

Ank*_*nkh 18

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

campaign: Joi.object().pattern(/^/, Joi.date().iso())
Run Code Online (Sandbox Code Playgroud)

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

campaign: Joi.object().pattern(/\w{2,25}/, Joi.date().iso())
Run Code Online (Sandbox Code Playgroud)

UPDATE

关于Joi文档中的示例,我没有测试过,但这是我的解释.我可以理解,这不是他们可以给出的最简单的例子......

const schema = Joi.object({
    arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'),
    value: Joi.string(),
}).pattern(/firstname|lastname/, Joi.string().min(2));
Run Code Online (Sandbox Code Playgroud)

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

{
    arg: 'firstname',
    value: 'john'
}

{
    arg: 'lastname',
    value: 'smith'
}

{
    arg: 'jobtitle',
    value: 'brewer'
}
Run Code Online (Sandbox Code Playgroud)

但是,它还允许对象具有属性,firstname并且lastname其值均为包含两个以上字符的字符串.因此,上述示例可以压缩为单个有效对象.

{
    firstname: 'john',
    lastname: 'smith',
    arg: 'jobtitle',
    value: 'brewer'
}
Run Code Online (Sandbox Code Playgroud)