我的目标是允许任意深度的嵌套对象可以包含任何内容。在该嵌套对象中,我想仅对字符串执行额外验证。
所以,对象看起来像这样:
{
"features": {
"feature1": "value1",
"feature2": false,
"feature3": 321,
"feature4": {
"something": "else"
},
"feature5": ["something", "more"]
}
对于我想要执行一些额外验证的所有字符串值,但对于其他所有内容,我只想接受它作为有效值。
我只是部分存在,需要一些帮助来处理嵌套对象等。这就是我所拥有的:
var providerSchema = Joi.object().keys({
features: Joi.object().pattern(/^/, Joi.alternatives()
.when(Joi.ref('features'), {
is: Joi.string(),
then: validateBlacklist(['<', '>']),
otherwise: Joi.any()
}))
});
function validateBlacklist(list) {
let regex = new RegExp(`^(?:(?!${list.join('|')}).)*$`);
return Joi.string().regex(regex)
.options({language: { string: { regex: { base: 'contains an invalid character'}}}});
}
问题1:alternative()。when()仅接受字符串 目前,feature对象中只接受字符串。似乎alternative()。when()部分无法正常工作。我试图检查引用是否是一个字符串;如果是,则通过validateBlaclist()执行额外验证,否则,接受它。
问题2:不支持嵌套对象 我的验证不支持对象内的对象。由于此功能对象可以包含任何内容,因此需要为任意深度支持此嵌套。
有谁知道该怎么做?任何帮助将不胜感激。
谢谢。