不允许在JOI中获取“语言”错误?

问题描述

我最近迁移到了新的joi存储库(@ hapi / joi => joi)

现在我在运行服务器时遇到错误

throw new AssertError([result.error.details[0].message]);
        ^

Error: "language" is not allowed

搜索了google和SO,但找不到解决方法

这是我的代码

  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()(就像您已经在做的那样)。