If I have two fields, I'd just like to validate when at least one field is a non empty string, but fail when both fields are empty strings.
Something like this does not validate
var schema = Joi.object().keys({ a: Joi.string(), b: Joi.string() }).or('a', 'b');
When validating against
{a: 'aa', b: ''}
The or
condition only tests for the presence of either key a
or b
, but does test whether the condition for a
or b
is true. Joi.string()
will fail for empty strings.
Here is gist with some test cases to demonstrate
http://requirebin.com/?gist=84c49d8b81025ce68cfb
empty strings are not allowed by default and must be enabled with allow('') . However, if you want to specify a default value in case of empty string you have to use a different pattern: Joi. string(). empty('').
string(). allow(''). allow(null) should have worked.
Code below worked for me. I used alternatives because .or is really testing for the existence of keys and what you really wanted was an alternative where you would allow one key or the other to be empty.
var console = require("consoleit"); var Joi = require('joi'); var schema = Joi.alternatives().try( Joi.object().keys({ a: Joi.string().allow(''), b: Joi.string() }), Joi.object().keys({ a: Joi.string(), b: Joi.string().allow('') }) ); var tests = [ // both empty - should fail {a: '', b: ''}, // one not empty - should pass but is FAILING {a: 'aa', b: ''}, // both not empty - should pass {a: 'aa', b: 'bb'}, // one not empty, other key missing - should pass {a: 'aa'} ]; for(var i = 0; i < tests.length; i++) { console.log(i, Joi.validate(tests[i], schema)['error']); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With