Javascript 如何在JOI 17中添加自定义验证器?
我在JOI 14上,似乎找不到升级指南可以升级到17。我看到有人为JOI 16发布了类似的问题,但上次更新是在3个月前。根据我在中看到的,它看起来不像是16年时需要的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: {
类型
我正在查看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())
-引用selfdotype:/(string | array)/,这样的旧基础没有涵盖这个问题,
解决了一部分问题:)就是不知道如何在这种环境下处理项(customJoi.string().kebabAlpha())
yet@DaveStein,请查看我的更新。希望我正确地理解了你的困境!现在我几乎所有的考试都通过了。我应该能够从API差异中找出最后几个掉队者。谢谢