Как выполнить проверку в Joi для альтернативных значений?

#javascript #node.js #joi

#javascript #node.js #joi

Вопрос:

Я хотел выполнить проверку тела запроса с помощью joi validator. Я объясню точный вариант использования в этом фрагменте:-

 const bodySchema=Joi.object().keys({
   userRef: Joi.string().length(24),
   userDetails: Joi.object()
    .keys(userDetailObj)
    .when('userRef', {
      is: Joi.exist(),
      then: {},
      otherwise: Joi.object().keys({
         firstName:Joi.string().required(),
         lastName:Joi.string().required()
      }).required(),
     }),
    });
  

В этом фрагменте мне нужен пустой объект, если userRef существует, то же самое относится и к UserDetails, если UserDetails существует, тогда мне не нужно поле userRef, но оно не работает.
Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.

Комментарии:

1. Итак, вы хотите userRef отсутствовать, если userDetails присутствует, и userRef присутствовать userDetails , если отсутствует?

2. Да, правильно. Не могли бы вы рассказать мне, как этого добиться?

Ответ №1:

joi версия 17.2.1

Либо:

 {
  "title": "title",
  "description": "description",

  "userRef": "aaaaaaaaaaaaaaaaaaaaaaaa"
}
  

Или:

 {
  "title": "title",
  "description": "description",

  "userDetails": {
    "firstName": "first",
    "lastName": "last"
  }
}
  

Решение с помощью тестов:

 const schema = Joi.alternatives().try(
  Joi.object().keys({
    title:Joi.string().required(),
    description:Joi.string().required(),
  
    userRef: Joi.string().length(24).required(),
  }).required(),
  Joi.object().keys({
    title:Joi.string().required(),
    description:Joi.string().required(),
  
    userDetails: Joi.object().keys({
      firstName: Joi.string().required(),
      lastName: Joi.string().required()  
    }).required(),
  }),
);



// works
const data1 = {
  title: 'title',
  description: 'description',

  userRef: 'aaaaaaaaaaaaaaaaaaaaaaaa',
};
console.log(schema.validate(data1).error);

// fails
const data2 = {
};
console.log(schema.validate(data2).error.message);

// works
const data3 = {
  title: 'title',
  description: 'description',

  userDetails: {
    firstName: 'first',
    lastName: 'last',
  },
};
console.log(schema.validate(data3).error);

// fails
const data4 = {
  title: 'title',
  description: 'description',

  userRef: 'a'.repeat(24),
  userDetails: {
    firstName: 'first',
    lastName: 'last',
  },
};
console.log(schema.validate(data4).error.message);

  

Комментарии:

1. эй, что делать, когда в объекте bodySchema есть больше полей, таких как title, description, которые требуются, поэтому в этом случае я смогу использовать Joi.alternatives() ? Пример:- const bodySchema={ title:Joi.string().required(), description:Joi.string().required(), userRef:Joi.string(), UserDetails:{ FirstName:Joi.string(), LastName:Joi.string() } }

2. Требуются title и description всегда требуются? (в обоих случаях)

3. Да, это всегда требуется.

4. Отлично 🙂 Примите решение, если оно сработало для вас. Чтобы другие могли видеть, что это правильный ответ