Joi проверяет необязательный массив из динамически добавляемых полей

У меня есть форма, в которой пользователь может добавить больше авторов, первый из них требуется, и у него есть собственная проверка полей

Когда пользователь добавляет больше авторов, эти авторы сохраняются в массиве, поэтому, если пользователь не добавляет больше авторов, отображается это сообщение об ошибке:

"\"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 (), но ошибка продолжает отображаться


person tttony    schedule 24.11.2018    source источник


Ответы (2)


Хорошо, я работал с этим кодом:

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

Два дополнения к моему исходному коду:

  1. .single() в array().items(), это будет принимать строки и массивы в ценности
  2. .assert(), чтобы проверить, соответствует ли длина массива равно

Благодаря этому сообщению, тестовый код здесь

person tttony    schedule 27.11.2018

Я думаю, что используемый здесь подход вводит в заблуждение, у вас должен быть массив объектов, даже если пользователь вставляет только одного автора или нескольких авторов. Использование разных массивов для 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'),
    }))
person Ganesh Karewad    schedule 26.11.2018