问题描述
我最近迁移到了新的joi存储库(@ hapi / joi => joi)
现在我在运行服务器时遇到错误
throw new AssertError([result.error.details[0].message]); ^ Error: "language" is not allowed
这是我的代码:
forgetUser: {
query: {
email: Joi.string().regex(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)
.required()
.options({ language: { string: { regex: { base: 'must be valid' } } } })
.label('Email')
}
},
请帮助我吗?
解决方法
这是由于您将未知字段传递给Joi模式而引起的。
例如,您具有以下Joi模式:
Joi.object({
name: Joi.string().required(),email: Joi.string().required(),});
,然后您传递此对象进行验证:
{
name: "John Doe",email: "[email protected]",language: "en"
}
由于架构内不允许language
,因此验证将引发错误/失败。
为防止这种情况,您可以在Joi Schema上传递stripUnknown
选项,以便去除未知字段
Joi.object({
name: Joi.string().required(),}).options({ stripUnknown: true });
或者您可以传递allowUnknown
,以便它将忽略未知字段
Joi.object({
name: Joi.string().required(),}).options({ allowUnknown: true });
您可以阅读有关验证选项here
的更多信息 ,这个问题尚不清楚您要达到什么目的(也许添加更多细节?)。
如果您要验证电子邮件,已经有一个内置功能可以验证:string.email()。
如果您仍然想进行自定义的正则表达式匹配,也可以使用内置功能:string.pattern()。
如果要将内置错误消息替换为自定义错误消息,Joi会使用.messages()
来提供。在此处查看答案:https://stackoverflow.com/a/58234246/1499476。
基本上,您可以执行以下操作:
forgetUser: {
query: {
email: Joi.string().pattern(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)
.required()
.label('Email')
.messages({
'string.pattern.base': '{#label} must be valid',// --> Email must be valid.
'string.base': '{#label} should be a type of "text"',... // other customisations
})
}
},
string.pattern()
也可以用作别名string.regex()
(就像您已经在做的那样)。