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)