Estoy usando ajv y quiero agregar un validador personalizado que inspeccione un objeto dado. Este validador personalizado debería devolver verdadero o fallar con el mensaje de error correcto. Residencia en
Empecé con el siguiente código de muestra
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({ })); // falseLamentablemente me enfrento a dos problemas:
Al inspeccionar la variable data dentro de la función de code , puedo ver que no contiene el objeto actual. Entonces, ¿cuál es la forma correcta de configurar una palabra clave personalizada?
Estoy buscando una función de muestra como
validate(theObject): boolean | string => { const anyPropIsFalse = Object.values(data).some(value => value === false); if(anyPropIsFalse) { return 'Any prop is false!'; } return true; }; o tal vez una función que devuelve void pero usa context.fail('Any prop is false!');
Nota al margen:
Mi escenario de caso de uso del mundo real es un objeto con dos propiedades, donde una es un objeto con una identificación y la otra propiedad es una matriz que contiene objetos con identificaciones. Debo asegurarme de que todos los identificadores de ambas propiedades sean completamente únicos.
Esto hace que el ejemplo funcione según lo previsto.
ajv.addKeyword({ keyword: "eachPropIsTrue", type: "object", schemaType: "boolean", compile: () => data => Object.values(data).every(value => !!value) });De todos modos, sugiero encarecidamente que verifique mejor la documentación de palabras clave definidas por el usuario de ajv .