Валидация Joi в случае альтернатив

Есть объект, у которого есть три ключа

const abc = {
  customerId: '777',
  firstName: 'pqr'',
  lastName: 'xyz',
};

Условие состоит в том, что если присутствует идентификатор клиента, то имя и фамилию можно игнорировать. В противном случае это должны быть строки максимальной длины 20.

const schema = Joi.object({
  customerId: Joi.string(),
  firstName: Joi.alternatives().when('customerId', {
    is: null,
    then: Joi.string(),
  }),
  lastName: Joi.alternatives().when('customerId', {
    is: null,
    then: Joi.string(),
  })
})
Joi.validate(abc, schema);

Вот я получаю эту ошибку

ошибка: {ValidationError: "firstName" недопустимо в Object.exports.process (/home/runner/node_modules/joi/lib/errors.js:

Итак, как это можно реализовать?


person Aayushi    schedule 20.09.2018    source источник


Ответы (2)


Вы должны использовать .or вместо when.

Вот рабочий пример: https://repl.it/@amasad/joi

Схема:

const schema = Joi.object({
  customerId: Joi.string(),
  firstName: Joi.string().max(20),
  lastName: Joi.string().max(20),
}).or('customerId', 'lastName')
  .or('customerId', 'firstName');
person Amjad Masad    schedule 20.09.2018
comment
в соответствии с вашим ответом это будет либо идентификатор клиента и фамилия, либо пользователь и имя. Но что, если случай, когда Customerid отсутствует, должны присутствовать и имя, и фамилия. - person Aayushi; 21.09.2018

Это потому, что ваша схема ищет firstname, в то время как ваш объект имеет вместо этого firstName. Попробуй без заглавной N.

const abc = {
   customerId: '777',
   firstname: 'pqr',
   lastname: 'xyz'
};
person tbking    schedule 20.09.2018
comment
После этого исправления должна быть другая ошибка. Вы можете это проверить? @Aayushi - person tbking; 21.09.2018