使用数组类型时,ajv 模式验证失败

问题描述 投票:0回答:1

我正在使用 ajv 使用相当简单的模式来验证 JSON 实例,但这在

array
类型上失败,并显示以下消息:

“这必须等于允许的值之一”

问题是,我的值允许的值之一。这似乎是一个简单的问题,但我还没有找到解决方案。这是我的代码:

const Ajv = require("ajv");
const ajv = new Ajv();

const schema = {
  type: "object",
  properties: {
    count: { type: "integer" },
    name: { type: "string" },
    bass: {
      type: "array",
      items: {
        type: "string",
      },
      enum: ["Ambush Custom Bass", "MTD", "Ken Smith", "Sadowsky"],
    },
  },
  required: ["count"],
};

const validate = ajv.compile(schema);

const data = {
  count: 1,
  name: "Andy",
  bass: ["MTD"],
};

const valid = validate(data);

console.log("valid: ", valid);

if (!valid) console.log(validate.errors);

感谢您的帮助。

json validation schema ajv
1个回答
0
投票

嗯,像往常一样,我必须先向大众提出问题,这样我才能自己弄清楚。我不知道这是否是正确的方式,但这就是我所做的: 首先,删除

enum

的关键字,如下所示:

ajv.removeKeyword("enum");

接下来,添加 
enum

关键字,以及您的自定义验证函数:

ajv.addKeyword({
  keyword: "enum",
  validate: (schema, data, value, other) => {
    // custom validation goes here
  }
});

最后,我发现这里的 
validate

函数没有提供添加详细错误消息的选项(或者,如果有的话,我不知道该怎么做),所以我创建了一个错误数组,然后将条目推入该数组,每个条目都是一个包含

other.instancePath
的对象。然后,当迭代
validation.errors
数组时,我将更详细的消息传递与 ajv 的错误结合起来,这样我就可以拥有自定义错误消息传递以及 ajv 提供的错误详细信息。我希望这是有道理的;如果没有,请给我留言,我会进一步解释。
    

© www.soinside.com 2019 - 2024. All rights reserved.