我使用ajv,希望添加一个自定义验证器来判断给定的对象.此自定义验证器应返回true或fail,并显示正确的错误消息.基于

我从以下示例代码开始

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

或者一个返回void但使用context.fail('Any prop is false!');的函数


Sidenote:

我的真实世界用例场景是一个具有两个属性的对象,其中一个是具有id的对象,另一个属性是包含具有id的对象的array.我必须确保这两个属性的all个ID是完全唯一的.

推荐答案

这使示例按预期工作.

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

无论如何,我强烈建议最好 Select ajv user-defined keywords documentation.

Javascript相关问答推荐

如何让\w token 在此RegEx中表现得不贪婪?

在JavaScript中检索一些文本

*ngFor和@代表输入decorator 和选角闭合

TypScript界面中的Infer React子props

我应该绑定不影响状态的函数吗?'

如何找出摆线表面上y与x相交的地方?

D3 Scale在v6中工作,但在v7中不工作

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

我的角模板订阅后不刷新'

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

在运行时使用Next JS App Router在服务器组件中运行自定义函数

覆盖TypeScrip中的Lit-Element子类的属性类型

基于props 类型的不同props ,根据来自接口的值扩展类型

在使用REACT更改了CSS类之后,无法更改CSS样式

在JS中动态创建对象,并将其追加到HTML表中

如何使用抽屉屏幕及其子屏幕/组件的上下文?

使用Reaction窗体挂钩注册日历组件

如何压缩图像并将其编码为文本?

使用Perl Selify::Remote::Driver执行Java脚本时出错

如何用react组件替换dom元素?