6 votes

Comment définir un mot-clé AJV personnalisé ?

J'utilise ajv et que vous souhaitez ajouter un validateur personnalisé pour inspecter un objet donné. Ce validateur personnalisé doit soit renvoyer vrai, soit échouer avec le bon message d'erreur. En se basant sur

J'ai commencé par l'exemple de code suivant

const Ajv = require("ajv");
const ajv = new Ajv({ allErrors: true });

ajv.addKeyword({
  keyword: "eachPropIsTrue",
  type: "object",
  schemaType: "boolean",
  code(context) {
    const { data } = context;
    const eachPropIsTrue = Object.values(data).every(value => !!value);

    context.fail(!eachPropIsTrue);
  },
})

const schema = {
  type: "object",
  eachPropIsTrue: true,
  properties: {
    a: { type: "boolean" }
  },
  required: [ "a" ],
  additionalProperties: false
};

const validate = ajv.compile(schema);
console.log(validate({ a: true })); // true
console.log(validate({ a: false })); // true but should be false!
console.log(validate({ })); // false

Malheureusement, je suis confronté à deux problèmes :

  • La deuxième validation n'échoue pas, alors que je m'attendais à ce qu'elle échoue
  • Où dois-je transmettre des informations sur le message d'erreur construit ?

Lors de l'inspection du data à l'intérieur de la variable code je peux voir qu'il ne contient pas l'objet actuel. Quelle est donc la bonne façon de mettre en place un mot-clé personnalisé ?

Je cherche un exemple de fonction du type

validate(theObject): boolean | string => {
  const anyPropIsFalse = Object.values(data).some(value => value === false);

  if(anyPropIsFalse) {
    return 'Any prop is false!';
  }

  return true;
};

ou peut-être une fonction renvoyant void mais en utilisant context.fail('Any prop is false!');


Sidenote :

Mon cas d'utilisation réel est un objet avec deux propriétés dont l'une est un objet avec un identifiant et l'autre un tableau contenant des objets avec des identifiants. Je dois m'assurer que tous Les identifiants des deux propriétés sont totalement uniques.

1voto

Daniele Ricci Points 11261

Cela permet à l'exemple de fonctionner comme prévu.

ajv.addKeyword({
  keyword:    "eachPropIsTrue",
  type:       "object",
  schemaType: "boolean",
  compile:    () => data => Object.values(data).every(value => !!value)
});

Quoi qu'il en soit, je vous conseille vivement de vérifier Documentation sur les mots-clés définis par l'utilisateur ajv .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X