使用Ajv验证数组类型时枚举验证失败,值符合要求却报错
问题原因与解决方案
你当前的错误是因为把enum配置在了bass数组的顶层属性中,这会让Ajv验证整个bass数组是否等于枚举列表里的某一个字符串值(比如要求bass是"MTD"而不是["MTD"]),但你的数据是数组类型,所以触发了"this must be equal to one of the allowed values"错误。
正确的做法是把enum移到items对象里,用来限制数组中的每个元素必须属于指定的枚举范围:
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); // 现在会输出true if (!valid) console.log(validate.errors);
这样配置后,Ajv会验证bass数组的每个元素都是枚举列表中的合法字符串,同时保证bass本身是数组类型,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者andyengle
相关产品推荐
相关产品推荐

