我正在使用 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);
感谢您的帮助。
嗯,像往常一样,我必须先向大众提出问题,这样我才能自己弄清楚。我不知道这是否是正确的方式,但这就是我所做的: 首先,删除
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 提供的错误详细信息。我希望这是有道理的;如果没有,请给我留言,我会进一步解释。