Using Joi, how to use .or for recursive objects

I am using the node Joi module to perform some checks, and I am having problems using the .or () method.

In their documentation, they define use as:

var schema = Joi.object().keys({
    a: Joi.any(),
    b: Joi.any()
}).or('a', 'b');

But I'm trying to validate an object, and I wanted to use .or () to check for properties nested in different properties, got it? Sort of:

var schema = Joi.object().keys({
  body:{
    device:{
      smthelse: Joi.any(),
      ua: Joi.string()
    }
  },
  headers:{
    'user-agent': Joi.string()      
}).or('body.device.ua', 'headers.user-agent');

But I can’t make it work. Does anyone know if I missed something? Is this a way for user .or () for nested objects?

Thank!

+4
source share
2 answers

Bulkan, . hapijs github issues , ( DavidTPate):

, , , object.or() , . .

var bodySchema = Joi.object().keys({
  body: Joi.object().keys({
    device: Joi.object().keys({
      ua: Joi.string().required()
    }).required();
  }).required();
}).required();
var headerSchema = Joi.object().keys({
  headers: Joi.object().keys({
    'user-agent': Joi.string().required()
  }).required()
}).required();
var schema = Joi.alternatives().try(bodySchema, headerSchema); 

: https://github.com/hapijs/joi/issues/643

+2

Joi :

var schema = Joi.object().keys({
  body: Joi.object().keys({
    device: Joi.object().keys({
      smthelse: Joi.any(),
      ua: Joi.string()
    }
  }),
  headers:  Joi.object().keys({
    'user-agent': Joi.string()      
  })
}).or('body.device.ua', 'headers.user-agent');
0

All Articles