У меня есть форма, в которой пользователь может добавить больше авторов, первый из них требуется, и у него есть собственная проверка полей
Когда пользователь добавляет больше авторов, эти авторы сохраняются в массиве, поэтому, если пользователь не добавляет больше авторов, отображается это сообщение об ошибке:
"\"authors_first_name\" must be an array"
"\"authors_last_name\" must be an array"
"\"authors_country\" must be an array"
Как сделать массив необязательным, если авторов не больше одного? Но требуется ли при добавлении авторов?
const schema = Joi.object().keys({
author_first_name: Joi.string().required().error(() => 'Author First Name is required'),
author_last_name: Joi.string().required().error(() => 'Author Last Name is required'),
author_country: Joi.string().valid(isoCodes).error(() => 'Author Country not valid'),
authors_first_name: Joi.array().items(Joi.string()).optional(),
authors_last_name: Joi.array().items(Joi.string()).optional(),
authors_country: Joi.array().items(Joi.string().valid(isoCodes).error(() => 'Country not valid')).optional()
});
Я добавил .optional (), но ошибка продолжает отображаться





Я думаю, что используемый здесь подход вводит в заблуждение, у вас должен быть массив объектов, даже если пользователь вставляет только одного автора или нескольких авторов. Использование разных массивов для first_name и last_name может привести к таким проблемам, как если бы у вас было 5 first_names и 6 last_names. вы можете добавлять проверки, но все же это своего рода ошибочный подход. Вы должны использовать такую схему
const schema = Joi.array().required().items(
Joi.object().required().keys({
author_first_name: Joi.string().required().error(() => 'Author First Name is required'),
author_last_name: Joi.string().required().error(() => 'Author Last Name is required'),
author_country: Joi.string().valid(isoCodes).error(() => 'Author Country not valid'),
}))
Хорошо, я получил работу с этим кодом:
const schema = Joi.object().keys({
first: Joi.array().items(Joi.string()).single(),
last: Joi.array().items(Joi.string()).single(),
country: Joi.array().items(Joi.string().valid(isoCodes)).single(),
}).assert('first.length', Joi.ref('last.length'))
.assert('last.length', Joi.ref('country.length'));
Два дополнения к моему исходному коду: