我正在使用一对自定义关键字来缓解我们的验证需求。到目前为止,它在任何地方都运行良好...但是现在,我没有让错误继续存在并在验证后被发现。
ajv.addKeyword('batch', {
compile: function validator(batch) {
const { limit, items } = batch;
const arraySchema = {
type: 'array',
items,
minItems: 1,
maxItems: limit,
};
return ajv.compile({
oneOf: [
arraySchema,
items,
],
});
},
errors: false,
});
ajv.addKeyword('customValidator', {
type: 'string',
validate: function validate(schema, data) {
try {
if (data.length > 500) {
throw new Error('should be <= 500 characters');
}
const { type } = myCustomValidator.parse(data);
if (schema === true || schema.includes(type)) {
return true;
}
throw new TypeError(`${data} must be one of the following: ${schema}`);
} catch (error) {
if (!validate.errors) {
validate.errors = [];
}
validate.errors.push(error);
return false;
}
},
errors: true,
});
使用这样的模式:
{
type: 'object',
required: [
'requiredFieldName',
],
properties: {
requiredFieldName: {
batch: {
items: { customValidator: ['allowedType'] },
limit: 100,
},
},
optionalFields: { customValidator: ['allowedType1', 'allowedType2'] },
},
}
然后,我创建了一个测试,该测试将导致myCustomValidator.parse
抛出失败。
{
requiredFieldName: ['blah', 'blah'],
}
使用console.log
,我可以看到它正在抛出并被捕获并被添加到validator.errors
中。我希望验证失败,但是最终却说验证通过了。对我做错了什么想法?
注意:如果我将模式items
中batch
的定义更改为type: 'integer'
,则按预期将失败。
答案 0 :(得分:0)
如果您在模式中的type: 'string'
之外还指定了customValidator
,那么结果是可行的:
{
type: 'object',
required: [
'requiredFieldName',
],
properties: {
requiredFieldName: {
batch: {
items: { type: 'string', customValidator: ['allowedType'] },
limit: 100,
},
},
optionalFields: { customValidator: ['allowedType1', 'allowedType2'] },
},
}
不知道为什么,但是现在可以了。