Вы можете использовать Joi.when()
и создать схему, подобную этой:
Joi.object().keys({
contact: Joi.object().keys({
first_name: Joi.string(),
last_name: Joi.string(),
phone: Joi.string(),
}),
address: Joi.object().keys({
place: Joi.string(),
city: Joi.string().min(2).max(30),
street: Joi.string(),
house_number: Joi.string()
}).when('contact', {
is: Joi.object().keys({
first_name: Joi.exist(),
last_name: Joi.exist(),
phone: Joi.exist(),
}),
then: Joi.object({ place: Joi.required() }).required(),
otherwise: Joi.object({ place: Joi.forbidden() })
}),
passengers_amount: Joi.number(),
notes: Joi.string()
});
Я просто упростил вашу шему, чтобы ее было легко понять.
По сути, мы говорим здесь, если concat.first_name , concat.last_name и concat.phone существует , тогда address и address.place являются обязательными , в противном случае address.place является запрещено .
Например, этот объект потерпит неудачу , поскольку адрес не существует:
{
address: {
first_name: 'a',
last_name: 'b',
phone: 'c'
}
}
и это не удастся, потому что address.place не существует:
{
address: {
first_name: 'a',
last_name: 'b',
phone: 'c'
},
concact: {
}
}
Наконец, в соответствии с определенной схемой, этот объект пройдет:
{
address: {
first_name: 'a',
last_name: 'b',
phone: 'c'
},
concact: {
place: 'd'
}
};