Joi 对象验证:如何验证具有未知键名的值?
Joi object validation: How to validate values with unknown key names?
我有一个对象,其键名我不可能知道 - 它们是由用户创建的。但是我知道它们(键)将存储什么值,并且它们(值)将是 ISO 字符串。我如何验证这些值?而且,可选,我如何验证未知对象的键,即:
key: Joi.string().min(2).max(25)
我已经尝试过的是基于 Joi API 文档:
Another benefits of using Joi.object([schema]) instead of a plain JS object is >that you can set any options on the object like allowing unknown keys, e.g:
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" }
我的错误:
"campaign" fails because ["g_ad_adwords" is not allowed]
试试这个。它基本上接受对象 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));
要验证的对象 必须 包含两个属性 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'
}
我有一个对象,其键名我不可能知道 - 它们是由用户创建的。但是我知道它们(键)将存储什么值,并且它们(值)将是 ISO 字符串。我如何验证这些值?而且,可选,我如何验证未知对象的键,即:
key: Joi.string().min(2).max(25)
我已经尝试过的是基于 Joi API 文档:
Another benefits of using Joi.object([schema]) instead of a plain JS object is >that you can set any options on the object like allowing unknown keys, e.g:
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" }
我的错误:
"campaign" fails because ["g_ad_adwords" is not allowed]
试试这个。它基本上接受对象 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));
要验证的对象 必须 包含两个属性 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'
}