Joi条件验证,如果数组包含值

时间:2019-08-09 16:06:58

标签: javascript typescript joi

我正在尝试创建joi验证,如果另一个数组字段包含某些特定数据,则将需要该字段。

当前,我有以下代码:


employeeType: Joi.array().items(
  Joi.string().valid(enumVars(EmployeeType)),
).required(),

w2Type: Joi.when('employeeType', {
    is: Joi.array().items(Joi.string().valid(EmployeeType.w2).required()), 
    then: Joi.string()
            .valid(Object.values(W2Type))
            .required(),
    otherwise: Joi.forbidden(),
}),
如果employeeType包含EmployeeType.w2,则必须为

w2Type字段 但这不是。

1 个答案:

答案 0 :(得分:0)

尝试以下代码。您必须按以下方式更改“ is”子句:

        const Joi = require('@hapi/joi');
        const schema = {
        employeeType: Joi.array().items(
            Joi.string().valid(['A', 'B', 'C'])).required(),
        w2Type: Joi.when('employeeType', {
            is: Joi.array().items(Joi.string().only('C').required(), Joi.any()),
            then: Joi.string().required()
        })
    }
    function main() {
        var valid = {
            employeeType: ['A', 'B'],
        }
        var Invalid = {
            employeeType: ['A', 'C'],
        }
        var validOne = {
            employeeType: ['A', 'C'],
            w2Type: 'sometext'
        }
        const result1 = Joi.validate(valid, schema);
        const result2 = Joi.validate(Invalid, schema);
        const result3 = Joi.validate(validOne, schema);

        if (result1.error != null) {
            console.error(result1.error);
        } else {
            console.log(result1.value + ' is valid input');
        }
        if (result2.error != null) {
            console.error(result2.error);
        } else {
            console.log(result2.value + ' is valid input');
        }
        if (result3.error != null) {
            console.error(result3.error);
        } else {
            console.log(result3.value + ' is valid input');
        }
    }
    main();

输出:

enter image description here