javascript - XOR validation using Joi-browser - Stack Overflow

I am using joi-browser 13.4.0. In order to generate error message for each input field I am trying to v

I am using joi-browser 13.4.0. In order to generate error message for each input field I am trying to validate fields using .required() like so:


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

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

But this example is invalid because when input1 or input2 is set to .required(), .xor() function is being ignored. Is there any other way to implement XOR validation without using .xor() method?

Thanks.

I am using joi-browser 13.4.0. In order to generate error message for each input field I am trying to validate fields using .required() like so:


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

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

But this example is invalid because when input1 or input2 is set to .required(), .xor() function is being ignored. Is there any other way to implement XOR validation without using .xor() method?

Thanks.

Share Improve this question asked Sep 24, 2019 at 22:34 TwistedOwlTwistedOwl 1,3242 gold badges18 silver badges33 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 6

You don't need required() if you're using xor:

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

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

In fact, using required() like that would never validate. You'd get one of the following error messages:

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

or

ValidationError: "value" contains a conflict between exclusive peers [input1, input2]

Use object.length()

Is there any other way to implement XOR validation without using .xor() method?

Yes, you could for example use the object().length() property to limit the keys in an object to 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));


Be careful

Don't forget to add required() to the parent object, otherwise it is possible to pass undefined to the validation function!

Without required() on the parent it is possible that a simple undefined will pass the validation:

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

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1743941176a4533554.html

相关推荐

  • javascript - XOR validation using Joi-browser - Stack Overflow

    I am using joi-browser 13.4.0. In order to generate error message for each input field I am trying to v

    2天前
    20

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信