Hapi/Joi validation with nested object

后端 未结 1 1213
甜味超标
甜味超标 2021-01-11 18:38

I have the following validation on one of my routes:

payload: {
    keywordGroups: Joi.array().items(Joi.object().keys({
        language: Joi.string().requi         


        
1条回答
  •  执念已碎
    2021-01-11 18:49

    You need to use Joi.alternatives() otherwise you will create a circular dependency as described in this issue.

    In your is condition in the when(), you need to specify a Joi type instead of just an empty array. This example works:

    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));
    

    The variable obj will fail the validation because both first and second are empty. Making either of them non-empty will pass the validation check.

    0 讨论(0)
提交回复
热议问题