Reputation: 293
I am trying to create nested schema in joi and it is throwing error
[Error: Object schema cannot be a joi schema]
var nestedSchema = joi.object({
b: joi.number()
});
var base = joi.object({
a: joi.string(),
nestedData:joi.object(nestedSchema)
});
How should i define nested schema in joi?
Upvotes: 29
Views: 34028
Reputation: 11
const base = joi.object({
a: joi.string(),
nestedData: joi.object({b: joi.number()})
});
Upvotes: 0
Reputation: 33
With Joi version 17.6.0
you can use the valid
function as below
const schema = Joi.object({
type: Joi.string().valid('android', 'ios').insensitive()
})
This will throw an error if the type property is not android
or ios
Upvotes: 0
Reputation: 549
just a tip based on Francesco's accepted answer:
if you need "nestedData" to be required -> "nestedData: nestedSchema.required()" in "base" will not work, you need to set it directly on "nestedSchema" just like any other parameter
var nestedSchema = joi.object().keys({
b: joi.number()
})
.required();
var base = joi.object({
a: joi.string(),
nestedData: nestedSchema
});
Upvotes: 4
Reputation: 709
Although Francesco's answer works, there's no need to use object.keys()
. The error the question creator was doing is to pass a schema as a parameter to joi.object()
.
So, creating nested schemas is as simple as assigning a schema to a key belonging to another schema.
const schemaA = Joi.string()
const schemaB = Joi.object({ keyB1: schemaA, keyB2: Joi.number() })
const schemaC = Joi.object({
keyC1: Joi.string(),
keyC2: schemaB
})
Joi.validate({ keyC1: 'joi', keyC2: { keyB1: 'rocks!', keyB2: 3 } }, schemaC)
Upvotes: 44
Reputation: 1795
You could use object.keys API
var nestedSchema = joi.object().keys({
b: joi.number()
});
var base = joi.object({
a: joi.string(),
nestedData: nestedSchema
});
Upvotes: 39