2017-03-30 1 views
1

Je rencontre un problème (ou ce que je crois être un) avec la validation Joi. J'essaie d'attribuer une valeur à une clé inexistante si elle a été transmise dans le corps de la requête.Joi validation définie par défaut comme objet vide

Ainsi, par exemple:

parameters: Joi.object().keys({ 
    keyA: Joi.string().allow('').allow(null).default(null), 
    keyB: Joi.object().keys({ 
    b1: Joi.string(), 
    b2: Joi.string(), 
    b3: Joi.object().keys({ 
     b3_1: Joi.string(), 
     b3_2: Joi.string(), 
     b3_3: Joi.string() 
    }) 
    }).default({}), 
    keyC: Joi.object().keys({ 
    c1: Joi.number(), 
    c2: Joi.number(), 
    c3: Joi.boolean(), 
    c4: Joi.boolean() 
    }).default({}), 
    keyD: Joi.object().keys({ 
    d1: Joi.number(), 
    d2: Joi.number() 
    }).default({}), 
    keyE: Joi.object().keys({ 
    e1: Joi.number() 
    }).default({}) 
}).allow(null) 

Donc, pour être précis, si je devais passer:

{ 
    keyA: "foo", 
    keyD: { 
    d1: 21.9, 
    d2: 21.1 
    }, 
    keyE: { 
    e1: 42 
    } 
} 

je recevrais ce en retour

{ 
    keyA: "foo", 
    keyB: {}, 
    keyC: {}, 
    keyD: { 
    d1: 21.9, 
    d2: 21.1 
    }, 
    keyE: { 
    e1: 42 
    } 
} 

Avec: yeux: sur les objets vides. Que manque-t-il avec la méthode Joi.default()? Suis-je en train de dépasser ce que Joi est destiné?

+0

Notez que je ne vois pas d'erreurs de validation - Je n'arrive pas à obtenir le résultat souhaité – bneigher

Répondre

1

Je commencerai par souligner que le schéma dans votre question n'est pas JavaScript valide, vous avez fermé un peu trop entre parenthèses avant de déclarer la règle pour keyC. Je suppose que c'est simplement une erreur de formatage avec la question et votre schéma actuel est actuellement valide. Deuxièmement, il n'y a rien de mal à la façon dont vous avez déclaré vos paramètres par défaut. Cela fonctionne très bien. Je suppose que c'est la façon dont vous validez le schéma qui est le problème.

Essayez d'exécuter ceci. J'ai imité la méthode de validation dans the docs for default().

const schema = Joi.object().keys({ 
    keyA: Joi.string().allow('').allow(null).default(null), 
    keyB: Joi.object().keys({ 
     b1: Joi.string(), 
     b2: Joi.string(), 
     b3: Joi.object().keys({ 
      b3_1: Joi.string(), 
      b3_2: Joi.string(), 
      b3_3: Joi.string() 
     }) 
    }).default({}), 
    keyC: Joi.object().keys({ 
     c1: Joi.number(), 
     c2: Joi.number(), 
     c3: Joi.boolean(), 
     c4: Joi.boolean() 
    }).default({}), 
    keyD: Joi.object().keys({ 
     d1: Joi.number(), 
     d2: Joi.number() 
    }).default({}), 
    keyE: Joi.object().keys({ 
     e1: Joi.number() 
    }).default({}) 
}).allow(null); 

Joi.validate({ 
    keyA: "foo", 
    keyD: { 
     d1: 21.9, 
     d2: 21.1 
    }, 
    keyE: { 
     e1: 42 
    } 
}, schema, (err, value) => 
{ 
    if (err) 
     throw err; 

    console.log(value); 
}); 

Je reçois cela dans la console:

{ 
    keyA :'foo', 
    keyD: { 
     d1: 21.9, 
     d2: 21.1 
    }, 
    keyE: { 
     e1: 42 
    }, 
    keyB: {}, 
    keyC: {} 
} 

Les touches ne sont pas susceptibles de regarder à l'ordre comme votre résultat attendu, mais cela ne devrait pas d'importance comme object keys are not ordered de toute façon.

+0

Oui, vous avez raison - le problème a fini par être dans une bibliothèque externe qui dépouillait les objets vides. – bneigher

-1

Vous pouvez définir les valeurs par défaut, vous devriez essayer ceci:

parameters: Joi.object().keys({ 
    keyA: Joi.string().allow(null).default(null), 
    keyB: Joi.object().keys({ 
    b1: Joi.string().default("abc"), 
     b2: Joi.string().default("abc"), 
     b3: Joi.object().keys({ 
     b3_1: Joi.string().default("abc"), 
     b3_2: Joi.string().default("abc"), 
     b3_3: Joi.string().default("abc") 
     }) 
    }) 
    }).default({}), 
    keyC: Joi.object().keys({ 
    c1: Joi.number().default(0), 
    c2: Joi.number().default(0), 
    c3: Joi.boolean().default(0), 
    c4: Joi.boolean().default(0) 
    }).default({}), 
    keyD: Joi.object().keys({ 
    d1: Joi.number().default(0), 
    d2: Joi.number().default(0) 
    }).default({}), 
    keyE: Joi.object().keys({ 
    e1: Joi.number().default(0) 
    }).default({}) 
}).allow(null) 
+0

Merci de votre retour! L'objectif est de définir les valeurs par défaut des objets en tant qu'objets vides. Je ne suis pas concerné par les valeurs des clés de l'objet - elles sont juste là pour montrer mon exemple – bneigher

+0

Il semble que Joi.object(). Default() n'est pas respecté – bneigher