Joi验证:单个字段有多个验证错误消息

时间:2018-11-26 13:38:38

标签: javascript validation express joi

我正在尝试通过joi https://www.npmjs.com/package/joi软件包实现以下验证流程。

1)如果没有显示错误category,请检查字段category required是否存在。

2)如果未显示错误消息provide valid category

,请检查类别字段仅允许使用字母

这是我的代码

const schema = Joi.object().keys({
    category: Joi.string().required().error(new Error('category is required')),
    category: Joi.string().regex(/^[a-zA-Z]*$/).required().error(new Error('category is not valid')),
});

但是它没有按预期工作

1 个答案:

答案 0 :(得分:1)

您实际上可以为error()函数提供回调,并检查导致错误的原因。

您的情况下的回调类似于:

const onError = x => {
    switch (x[0].type) {
        case 'any.required': {
            return new Error('category is required');
        }
        case 'string.regex.base': {
            return new Error('category is not valid');
        }
        default: {
            return new Error('category has some error');
        }
    }
}; 

然后您可以像这样使用它:

category: Joi.string()
        .regex(/^[a-zA-Z]*$/)
        .required()
        .error(onError)

这是我使用的完整代码段:

const Joi = require('joi');

const onError = x => {
    switch (x[0].type) {
        case 'any.required': {
            return new Error('category is required');
        }
        case 'string.regex.base': {
            return new Error('category is not valid');
        }
        default: {
            return new Error('category has some error');
        }
    }
};

const schema = Joi.object().keys({
    category: Joi.string()
        .regex(/^[a-zA-Z]*$/)
        .required()
        .error(onError)
});

const testCategories = [{ category: 'ABCD' }, {}, { category: '&&&' }];

testCategories.forEach(aCategory => {
    schema
        .validate(aCategory)
        .then(() => {
            console.log(JSON.stringify(aCategory), 'passed!');
        })
        .catch(e => {
            console.log(JSON.stringify(aCategory), 'failed', e);
        });
});