Javascript 如何在JOI 17中添加自定义验证器?

Javascript 如何在JOI 17中添加自定义验证器?,javascript,joi,Javascript,Joi,我在JOI 14上,似乎找不到升级指南可以升级到17。我看到有人为JOI 16发布了类似的问题,但上次更新是在3个月前。根据我在中看到的,它看起来不像是16年时需要的类型 我正在查看type的描述是模式的类型。可以是字符串,也可以是匹配多种类型的正则表达式。 我试过这样的方法: const customJoi = Joi.extend(joi => ({ type: 'string', base: joi.string(), messages: {

我在JOI 14上,似乎找不到升级指南可以升级到17。我看到有人为JOI 16发布了类似的问题,但上次更新是在3个月前。根据我在中看到的,它看起来不像是16年时需要的
类型

我正在查看
type
的描述是
模式的类型。可以是字符串,也可以是匹配多种类型的正则表达式。

我试过这样的方法:

const customJoi = Joi.extend(joi => ({
    type: 'string',
    base: joi.string(),
    messages: {
        'string.snakeAlpha': '{{#label}} must be snake case'
    },
    rules: {
        snakeAlpha: {
            validate(value, helpers)
            {
                if (!/^[a-z]+(_[a-z]+)*$/.test(value))
                {
                    return helpers.error('string.snakeAlpha', { value });
                }

                return value;
            }
        }
    }
}));
const snakeapha=joi=>{
返回{
类型:“对象”,
名称:'Snakeapha',
base:joi.string().regex(/^[a-z]+([a-z]+)*$/)
};
};
const customJoi=Joi.extend({
类型:“对象”,
规则:{
蛇阿尔法
}
});
它给了我这个错误:

验证错误:{
“类型”:“对象”,
“规则”:{
“SnakeApha”[1]:“[joi=>{\n return{\n type:'object',\n name:'SnakeApha',\n base:joi.string().regex(/^[a-z]+)*$/)\n};\n}”
}
}
[1] “rules.snakeAlpha”必须是object类型
我很困惑,因为我说的是
对象
。我还尝试了
string
,因为这是基本的,但它有相同的错误消息

更新 我还意识到最初的示例只涉及了一个不引用joi(regex)的简单规则。我也有参考其他自定义验证程序的验证程序,如下面所示。解决这个问题也需要额外的积分

const arrayKebabAlpha=joi=>{
返回{
键入:“字符串”,
名称:“arrayKebabAlpha”,
基本:joi.array().items(joi.kebabaAlpha())
};
};

对于这样一个有用的特性,Joi扩展的文档令人失望地缺乏生气。幸运的是,Joi的很多核心都是使用扩展编写的,因此可以从中学习到很多东西

如果我将您的规则编写为扩展,它将如下所示:

const customJoi = Joi.extend(joi => ({
    type: 'string',
    base: joi.string(),
    messages: {
        'string.snakeAlpha': '{{#label}} must be snake case'
    },
    rules: {
        snakeAlpha: {
            validate(value, helpers)
            {
                if (!/^[a-z]+(_[a-z]+)*$/.test(value))
                {
                    return helpers.error('string.snakeAlpha', { value });
                }

                return value;
            }
        }
    }
}));
可以像这样使用:

customJoi.object().keys({
    foo: customJoi.string().snakeAlpha()
});
更新

这是否是处理依赖扩展的正确方法,我不确定,但这是我通常处理它们的方式

我首先在数组中定义扩展,确保首先定义依赖扩展。然后我将使用前面的
customJoi
实例遍历数组,以便下一个扩展包括在它之前定义的扩展。一个简单的工作示例可能比我能用语言表达的更好

(我还简化了扩展,使其更符合您使用它们的习惯)


Hoo boy我曾经做过
customJoi.snakeAlpha()
,所以为了使用它,我做了很多代码更改,但我要做一个尝试:)我正在更新我的问题,因为我意识到像
joi.array().items(joi.kebapalpha())
-引用selfdo
type:/(string | array)/,这样的旧基础没有涵盖这个问题,
解决了一部分问题:)就是不知道如何在这种环境下处理
项(customJoi.string().kebabAlpha())
yet@DaveStein,请查看我的更新。希望我正确地理解了你的困境!现在我几乎所有的考试都通过了。我应该能够从API差异中找出最后几个掉队者。谢谢