Я использую айв и хочу добавить собственный валидатор, проверяющий данный объект. Этот пользовательский валидатор должен либо вернуть true, либо завершиться ошибкой с правильным сообщением об ошибке. На основе
Я начал со следующего примера кода
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.info(validate({ a: true })); // true
console.info(validate({ a: false })); // true but should be false!
console.info(validate({ })); // false
К сожалению, я столкнулся с двумя проблемами:
При проверке переменной data
внутри функции code
я вижу, что она не содержит текущий объект. Так как же правильно настроить пользовательское ключевое слово?
Я ищу образец функции, например
validate(theObject): boolean | string => {
const anyPropIsFalse = Object.values(data).some(value => value === false);
if (anyPropIsFalse) {
return 'Any prop is false!';
}
return true;
};
или, может быть, функция, возвращающая void
, но использующая context.fail('Any prop is false!');
Примечание:
Мой сценарий использования в реальном мире — это объект с двумя свойствами, одно из которых является объектом с идентификатором, а другое свойство — массивом, содержащим объекты с идентификаторами. Я должен убедиться, что идентификаторы все из обоих свойств полностью уникальны.
Это заставляет пример работать так, как задумано.
ajv.addKeyword({
keyword: "eachPropIsTrue",
type: "object",
schemaType: "boolean",
compile: () => data => Object.values(data).every(value => !!value)
});
В любом случае, я настоятельно рекомендую лучше проверить Документация по определяемым пользователем ключевым словам ajv.