web-dev-qa-db-fra.com

Validation d'objet Joi: comment valider des valeurs avec des noms de clé inconnus?

J'ai un objet avec des noms de clés que je ne peux pas savoir - ils sont créés par l'utilisateur. Cependant, je sais quelles valeurs ils (clés) vont stocker, et ils (valeurs) vont être des chaînes ISO. Comment valider ces valeurs? Et, facultativement , comment puis-je valider les clés d'objets inconnus, c'est-à-dire:

 key: Joi.string().min(2).max(25)

Ce que j'ai déjà essayé était basé sur les documents de l'API Joi:

Un autre avantage de l'utilisation de Joi.object ([schéma]) au lieu d'un simple objet JS est que vous pouvez définir toutes les options sur l'objet comme autoriser les clés inconnues, par exemple:

const schema = Joi.object({ arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'), value: Joi.string(), }).pattern(/firstname|lastname/, Joi.string().min(2));

Ce que j'ai compris de l'exemple est que la touche arg représente Joi.object()key, et value représente son value.

Mon exemple:

campaign: Joi.object({
  arg: Joi.string().valid( 'unknown' ),
  value: Joi.date().iso(),
}).pattern( /unknown/, Joi.string().min(2).max(25) )

Mon entrée;

campaign: { g_ad_adwords: "2017-01-19T11:33:26.205Z" }

Mon erreur:

"campagne" échoue car ["g_ad_adwords" n'est pas autorisé]

14
wscourge

Essaye ça. Il accepte essentiellement n'importe quelle clé dans un objet campaign et la valeur doit être validée par rapport à Joi.date().iso()

campaign: Joi.object().pattern(/^/, Joi.date().iso())

Cela correspondra cependant à n'importe quelle touche . Vous pouvez restreindre cela en remplissant légèrement l'expression régulière. par exemple. uniquement les caractères Word entre 2 et 25 caractères

campaign: Joi.object().pattern(/\w{2,25}/, Joi.date().iso())

METTRE À JOUR

Concernant l'exemple dans les documents Joi, je ne l'ai pas testé mais voici mon interprétation. Je peux comprendre que ce n'est pas l'exemple le plus simple qu'ils auraient pu donner ...

const schema = Joi.object({
    arg: Joi.string().valid('firstname', 'lastname', 'title', 'company', 'jobtitle'),
    value: Joi.string(),
}).pattern(/firstname|lastname/, Joi.string().min(2));

Les objets à valider doivent contenir les deux attributs arg et valuearg la valeur de peut être un de 'firstname', 'lastname', 'title', 'company', 'jobtitle' et value n'est qu'une chaîne.

{
    arg: 'firstname',
    value: 'john'
}

{
    arg: 'lastname',
    value: 'smith'
}

{
    arg: 'jobtitle',
    value: 'brewer'
}

Cependant, cela permettra également à l'objet d'avoir les attributs firstname et lastname où leurs deux valeurs sont une chaîne de plus de deux caractères. Ainsi, les exemples ci-dessus pourraient être condensés en un seul objet valide.

{
    firstname: 'john',
    lastname: 'smith',
    arg: 'jobtitle',
    value: 'brewer'
}
19
Ankh