31

我有一个我不可能知道的键名的对象——它们是由用户创建的。但是我确实知道它们(键)将存储什么值,并且它们(值)将是 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));

我从例子中了解到的是argkey 代表Joi.object()'s key,并且value代表 it's 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" }

我的错误:

"campaign" 失败,因为 ["g_ad_adwords" is not allowed]

4

1 回答 1

36

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

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

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

campaign: Joi.object().pattern(/\w{2,25}/, Joi.date().iso())

更新

关于Joi 文档中的示例,我尚未对其进行测试,但这是我的解释。我可以理解,这不是他们可以给出的最直接的例子......

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

要验证的对象必须包含两个属性arg,并且valuewherearg的值可以是其中之一,'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'
}
于 2017-01-19T16:07:56.703 回答