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

wou*_*_be 9 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(),
}
Run Code Online (Sandbox Code Playgroud)

我试图让它containsAnycontainsAll必须至少包含一个字符串.如果containsAny为空,containsAll则应至少有一个项目.如果containsAll是空的,containsAny至少应该包括一个项目.

但是Joi.when当涉及一系列对象时,它似乎并不真正起作用.

Cut*_*ert 5

您需要使用Joi.alternatives()否则您将创建循环依赖项,如本期中所述.

在你的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));
Run Code Online (Sandbox Code Playgroud)

变量obj将失败,因为这两个验证firstsecond是空的.使其中任何一个非空都将通过验证检查.