我对我的其中一条路线进行了以下验证:
payload: {
keywordGroups: Joi.array().items(Joi.object().keys({
language: Joi.string().required(),
containsAny: Joi.array().items(Joi.string()).default([]).when('containsAll', { is: [], then: Joi.required() }),
containsAll: Joi.array().items(Joi.string()).default([]).when('containsAny', { is: [], then: Joi.required() }),
notContainsAll: Joi.array().items(Joi.string()).default([]),
notContainsAny: Joi.array().items(Joi.string()).default([])
})).required(),
}
我正在努力做到这一点containsAny
or containsAll
必须至少包含一个字符串。如果containsAny
是空的,containsAll
应该至少有一项。而如果containsAll
是空的,containsAny
应至少包括一项。
但似乎Joi.when
当涉及到对象数组时,它并没有真正起作用。
你需要使用Joi.alternatives() https://github.com/hapijs/joi/blob/v7.2.2/API.md#alternatives否则,您将创建循环依赖项,如中所述这个问题 https://github.com/hapijs/joi/issues/588.
In your is
条件在when()
,您需要指定一个 Joi 类型,而不仅仅是一个空数组。这个例子有效:
import * as Joi from 'joi';
var arraySchema = Joi.array().items(Joi.object().keys({
first: Joi.array().items(Joi.number()).default([])
.when('second', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}),
second: Joi.array().items(Joi.number()).default([])
}));
var altArraySchema = Joi.array().items(Joi.object().keys({
first: Joi.array().items(Joi.number()).default([]),
second: Joi.array().items(Joi.number()).default([])
.when('first', {is: Joi.array().length(0), then: Joi.array().items(Joi.number()).required().min(1)}),
}));
var obj = [
{
first: [],
second: []
}
];
var finalSchema = Joi.alternatives(arraySchema, altArraySchema);
var result = Joi.validate(obj, finalSchema);
console.log(JSON.stringify(result, null, 2));
变量obj
验证将失败,因为两者first
and second
是空的。使它们中的任何一个非空都将通过验证检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)