如何设置自定义 AJV 关键字?

How to set up a custom AJV keyword?

我正在使用 ajv 并想添加一个自定义验证器来检查给定的对象。此自定义验证器应该 return 为真或失败并显示正确的错误消息。基于

我从以下示例代码开始

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;
};

或者可能是 returning void 但使用 context.fail('Any prop is false!');

的函数

旁注:

我的真实世界用例场景是一个具有两个属性的对象,其中一个是具有 id 的对象,另一个 属性 是一个包含具有 id 的对象的数组。我必须确保来自两个属性的 all id 是完全唯一的。

这使得该示例按预期工作。

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

无论如何我强烈建议更好地检查ajv user-defined keywords documentation