I have the following validation on one of my routes:
payload: {
keywordGroups: Joi.array().items(Joi.object().keys({
language: Joi.string().requi
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.