使用Joi浏览器进行XOR验证

时间:2019-09-24 22:34:08

标签: javascript validation 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验证?

谢谢。

2 个答案:

答案 0 :(得分:1)

如果您使用的是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]

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

答案 1 :(得分:1)

使用object.length()

  

是否有其他方法可以在不使用.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));