this is just to clarify the uses of or
and oxor
.
If you are using or
It will allow you to add at least one of the required properties. Example
const Joi = require('joi');
const schema = Joi.object().keys({
email: Joi.string().email(),
mobile: Joi.number().integer(),
firstname: Joi.string(),
lastname: Joi.string(),
address: Joi.string()
}).or("email", "mobile", "firstname", "lastname");
Joi.validate({ email: 'xxx@yyy.com', mobile: '999000999000' }, schema, console.log);
Joi.validate({ mobile: '999000999000' }, schema, console.log);
Joi.validate({ email: 'xxx@yyy.com' }, schema, console.log);
Joi.validate({ firstname: "John" }, schema, console.log);
Joi.validate({ lastname: "Doe" }, schema, console.log);
Joi.validate({ email: 'xxx@yyy.com', firstname: "John" }, schema, console.log);
Joi.validate({}, schema, console.log); // fails
Any of these example above are correct, because we specified at least one of the properties that were provided in the or
method
While for oxor
This method says once one of the property listed is provided the validation is correct. But if another property from the list is provided the validation fails.
For example
const Joi = require('joi');
const schema = Joi.object().keys({
email: Joi.string().email(),
mobile: Joi.number().integer(),
firstname: Joi.string(),
lastname: Joi.string(),
address: Joi.string()
}).oxor("email", "mobile", "firstname", "lastname");
Joi.validate({ email: 'xxx@yyy.com', mobile: '999000999000' }, schema, console.log); // fails
Joi.validate({ mobile: '999000999000' }, schema, console.log); // valid
Joi.validate({ email: 'xxx@yyy.com' }, schema, console.log); // valid
Joi.validate({ firstname: "John" }, schema, console.log); // valid
Joi.validate({ lastname: "Doe" }, schema, console.log); // valid
Joi.validate({ email: 'xxx@yyy.com', firstname: "John" }, schema, console.log); // fails
Joi.validate({}, schema, console.log); // valid
As explained above, when using the oxor
method it will make sure that only one of the listed properties can be used.
Now what if you don't want empty value provided, and you also don't want more than one of the listed property to be used? Then you do it like so.
const Joi = require('joi');
const schema = Joi.object().keys({
email: Joi.string().email(),
mobile: Joi.number().integer(),
firstname: Joi.string(),
lastname: Joi.string(),
address: Joi.string()
}).or("email", "mobile", "firstname", "lastname").oxor("email", "mobile", "firstname", "lastname");
Joi.validate({ email: 'xxx@yyy.com', mobile: '999000999000' }, schema, console.log); // not valid
Joi.validate({ mobile: '999000999000' }, schema, console.log); // valid
Joi.validate({ email: 'xxx@yyy.com' }, schema, console.log); // valid
Joi.validate({ firstname: "John" }, schema, console.log); // valid
Joi.validate({ lastname: "Doe" }, schema, console.log); // valid
Joi.validate({ email: 'xxx@yyy.com', firstname: "John" }, schema, console.log); // not valid
Joi.validate({}, schema, console.log); // not valid
Now the validation process accepts only one property and no empty property.