在ajv v8中,如果你使用枚举类型并且在一个组合校验中使用了“oneOf”,可能会遇到一个问题:无论输入什么值,都会显示枚举错误。
这是因为在ajv v8中,验证顺序已经改变,从而导致枚举验证在组合验证之前进行,导致无法正确验证。
为了解决这个问题,你可以手动指定验证的顺序,将枚举验证放在组合验证之后,如下所示:
const Ajv = require('ajv');
const ajv = new Ajv({allErrors: true});
ajv.addKeyword('oneOfOrder', {
macro(schemaArray) {
return {
oneOf: schemaArray.map(schema=>ajv.validate(schema, true) ? schema : {})
}
},
errors: false,
metaSchema: {
type: 'array',
items: {type: 'object'},
minItems: 1
}
});
const schema = {
type: 'object',
properties: {
foo: {type: 'string'},
bar: {type: 'number'}
},
oneOfOrder: [
{properties: {foo: {const: 'abc'}}},
{properties: {bar: {const: 123}}}
]
};
const validate = ajv.compile(schema);
const valid = validate({foo: 'abc'});
if (!valid) console.log(validate.errors);
这里我们使用了一个新的关键词“oneOfOrder”,手动将枚举验证放在组合验证之后,从而解决了枚举验证错误的问题。
上一篇:ajv数组与联合类型