我正在使用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验证?
谢谢。
答案 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));