为什么在自定义关键字验证后validate.errors为空?

时间:2019-06-18 19:15:50

标签: javascript ajv

我正在使用一对自定义关键字来缓解我们的验证需求。到目前为止,它在任何地方都运行良好...但是现在,我没有让错误继续存在并在验证后被发现。

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中。我希望验证失败,但是最终却说验证通过了。对我做错了什么想法?

注意:如果我将模式itemsbatch的定义更改为type: 'integer',则按预期将失败。

1 个答案:

答案 0 :(得分:0)

如果您在模式中的type: 'string'之外还指定了customValidator,那么结果是可行的:

{
    type: 'object',
    required: [
        'requiredFieldName',
    ],
    properties: {
        requiredFieldName: {
            batch: {
                items: { type: 'string', customValidator: ['allowedType'] },
                limit: 100,
            },
        },
        optionalFields: { customValidator: ['allowedType1', 'allowedType2'] },
    },
}

不知道为什么,但是现在可以了。