使用嵌套对象进行Hapi / Joi验证

时间:2015-11-18 02:27:48

标签: javascript validation hapijs joi

我在其中一条路线上进行了以下验证:

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(),
}

我试图让containsAnycontainsAll包含至少一个字符串。如果containsAny为空,则containsAll应至少包含一个项目。如果containsAll为空,containsAny至少应包含一个项目。

但是当涉及一系列对象时,Joi.when似乎并不真正有效。

1 个答案:

答案 0 :(得分:5)

您需要使用Joi.alternatives(),否则您将创建循环依赖关系,如this issue中所述。

is的{​​{1}}条件中,您需要指定一个Joi类型而不是一个空数组。这个例子有效:

when()

变量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)); 将无法通过验证,因为objfirst都为空。使其中任何一个非空都将通过验证检查。