Джой проверить необязательный массив из динамически добавленных полей - PullRequest
0 голосов
/ 24 ноября 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

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

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(), чтобы проверить, равна ли длина массива

Благодаря этой записи , тестовый код здесь

0 голосов
/ 26 ноября 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'),
    }))
...