我正在使用ajv,并希望添加一个检查给定对象的自定义验证器。此自定义验证器应返回true或fail并返回正确的错误消息。基于
- (不推荐使用语法(AJV自定义关键字验证
- https://ajv.js.org/keywords.html#define-具有代码生成功能的关键字
我从以下示例代码开始
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
不幸的是,我面临两个问题:
- 第二次验证没有失败,尽管我预计它会失败
- 我必须在哪里传递有关构造的错误消息的信息
当检查code
函数内的data
变量时,我可以看到它不包含当前对象。那么,设置自定义关键字的正确方法是什么呢?
我正在寻找一个类似的示例函数
validate(theObject): boolean | string => {
const anyPropIsFalse = Object.values(data).some(value => value === false);
if(anyPropIsFalse) {
return 'Any prop is false!';
}
return true;
};
或者可能是返回CCD_ 3但使用CCD_
旁注:
我的真实世界用例场景是一个具有两个属性的对象,其中一个是具有id的对象,另一个属性是包含具有id对象的数组。我必须确保来自两个属性的所有id都是完全唯一的。
这使示例按预期工作。
ajv.addKeyword({
keyword: "eachPropIsTrue",
type: "object",
schemaType: "boolean",
compile: () => data => Object.values(data).every(value => !!value)
});
无论如何,我强烈建议更好地查看ajv用户定义的关键字文档。