web-dev-qa-db-fra.com

Schéma imbriqué Joi

J'essaie de créer un schéma imbriqué dans joi et cela génère une erreur

[Erreur: le schéma d'objet ne peut pas être un schéma joi]

var nestedSchema = joi.object({
    b: joi.number()
});

var base = joi.object({
    a: joi.string(),
    nestedData:joi.object(nestedSchema)
});

Comment définir un schéma imbriqué dans joi?

21
Anshul

Vous pouvez utiliser object.keys API

var nestedSchema = joi.object().keys({
    b: joi.number()
});

var base = joi.object({
    a: joi.string(),
    nestedData: nestedSchema
});
13
Francesco Pezzella

Bien que la réponse de Francesco fonctionne, il n'est pas nécessaire d'utiliser object.keys(). L'erreur que le créateur de la question faisait était de passer un schéma en tant que paramètre à joi.object().

Ainsi, la création de schémas imbriqués est aussi simple que l'attribution d'un schéma à une clé appartenant à un autre schéma.

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)
20
Túbal Martín

juste un conseil basé sur la réponse acceptée de Francesco:

si vous avez besoin de "nestedData" pour être requis -> "nestedData: nestedSchema.required ()" dans "base" ne fonctionnera pas, vous devez le définir directement sur "nestedSchema" comme tout autre paramètre

    var nestedSchema = joi.object().keys({
        b: joi.number()
    })
    .required();

    var base = joi.object({
        a: joi.string(),
        nestedData: nestedSchema
    });
1
fkvestak