Проверка XOR с использованием Joi-браузера

Я использую браузер joi 13.4.0. Чтобы создать сообщение об ошибке для каждого поля ввода, я пытаюсь проверить поля с помощью .required () следующим образом:


  config = {
    input1: Joi.string()
      .empty("")
      .required(),
    input2: Joi.string()
      .empty("")
      .required()
  };

  schema = Joi.object(this.config).xor("input1", "input2");

Но этот пример неверен, потому что, когда input1 или input2 установлен на .required (), функция .xor () игнорируется. Есть ли другой способ реализовать проверку XOR без использования метода .xor ()?

Спасибо.


person Wiktor    schedule 24.09.2019    source источник


Ответы (2)


Вам не нужно required(), если вы используете xor:

config = {
  input1: Joi.string().empty(""),
  input2: Joi.string().empty("")
};

schema = Joi.object(config).xor("input1", "input2");

Фактически, использование такого required() никогда не подтвердит. Вы получите одно из следующих сообщений об ошибке:

ValidationError: child "input1" fails because ["input1" is required]

or

ValidationError: "value" contains a conflict between exclusive peers [input1, input2]
person Danny Buonocore    schedule 25.09.2019
comment
Проблема с этим подходом заключается в том, что массив path под error.details пуст. Вот почему я хотел проверить каждое поле отдельно. - person Wiktor; 25.09.2019

Используйте 1_

Есть ли другой способ реализовать проверку XOR без использования метода .xor ()?

Да, вы можете, например, использовать свойство object().length(), чтобы ограничить ключи в объекте значением 1.

const Joi = require('joi-browser')

const schema = Joi.object().keys({
  input1: Joi.string().empty(''),
  input2: Joi.string().empty('')
}).required().length(1);

const value = {
  input1: "input1",
};

// this will fail
// const value = {};

// this will fail too
// const value = {
//   input1: 'input1',
//   input2: 'input2',
// };

const result = Joi.validate(value, schema);
console.log(JSON.stringify(result.error, null, 2));


Будь осторожен

Не забудьте добавить required() к родительскому объекту, иначе можно передать undefined функции проверки!

Без required() на родительском элементе возможно, что простой undefined пройдет проверку:

const Joi = require('joi-browser')

const schema = Joi.object().keys({
  input1: Joi.string().empty(''),
  input2: Joi.string().empty('')
}).length(1); // no required()

const value = undefined; // this will pass validation

const result = Joi.validate(value, schema);
console.log(JSON.stringify(result.error, null, 2));
person a1300    schedule 27.09.2019