【问题标题】:Display same custom error message for any string type error [ EXPRESS + JOI ]为任何字符串类型错误显示相同的自定义错误消息 [EXPRESS + JOI]
【发布时间】:2020-04-09 16:11:35
【问题描述】:

我有两个字段 phone 字段和 phoneCode 字段。我正在使用“@hapi/joi”16.1.8 版本和 expressjs。

对于自定义错误消息,我使用 .messages() 方法而不是 .error() 方法,因为它非常直接。这是我尝试使用 Joi 系统验证的代码:

const data = { phone, phoneCode };
const schema = Joi.object({
    phone: Joi.string().pattern(/^[0-9]{10}$/).required().messages({
        "string.base": "Sorry! It looks like something went wrong. Please try later.",
        "string.pattern.base": "Phone number must be a 10 digits number.",
        "string.empty": "Phone Number is not allowed to be empty."
    }),
    phoneCode: Joi.string().max(3).required().messages({ 
        "number": "Want to send default message if any error" 
    })
});

let validate = schema.validate(data, { abortEarly: false });

当 phoneCode 键中出现错误时,我只想发送一条默认消息。我也试过了

"number.*": "Want to send default message if any error"
  OR
Joi.string().max(3).required().message("Want to send default message if any error") // It give Error: Cannot apply rules to empty ruleset
  OR
phoneCode: Joi.string().max(3).message("Want to send default message if any error" ).required() // This worked upto a limit, not working if i sent phoneCode empty.

【问题讨论】:

    标签: node.js express hapijs joi


    【解决方案1】:

    我想这在 Joi 中是不可能的。如果phoneCode出现问题,您可以使用.error(new Error(errMsg))发回单个错误:

    const Joi = require('@hapi/joi');
    
    const joiSchema = Joi.object({
        phone: Joi.string().pattern(/^[0-9]{10}$/).required().messages({
            "string.base": "Sorry! It looks like something went wrong. Please try later.",
            "string.pattern.base": "Phone number must be a 10 digits number.",
            "string.empty": "Phone Number is not allowed to be empty."
        }),
        phoneCode: Joi.string().max(3).required().error(new Error("Want to send default message if any error"))
    }).error((errors) => new Error(errors.join(' ')));
    
    const { error, value } = joiSchema.validate({ phone: 123, phoneCode: null }, { abortEarly: false });
    console.log(error, value);
    

    输出:

    Error: Sorry! It looks like something went wrong. Please try later. Error: Want to send default message if any error
    Object {phone: 123, phoneCode: null}
    

    但请记住,如果是.messages(),Joi 会发回ValidationError,但现在它会发回Error。您可以根据您的要求格式化您的错误,我只是在末尾添加了一个空格。

    带有可执行代码的RunKit:https://runkit.com/rvypandey/5e394a3b78e4df0013483771

    【讨论】:

      【解决方案2】:

      这就是我在 JOI 中实现自定义错误消息的方式。只需从验证对象获取消息。它简单且工作良好。

      const data = { phone, phoneCode };
      const schema = Joi.object({
          phone: Joi.string().pattern(/^[0-9]{10}$/).required().messages({
              "string.base": "Sorry! It looks like something went wrong. Please try later",
              "string.pattern.base": "Phone number must be a 10 digits number",
              "string.empty": "Phone Number is not allowed to be empty",
              "any.required": "Phone Number is required"
          }),
          phoneCode: Joi.string().max(3).required().messages({ 
              "string.base": "Phone code must be valid",
              "string.empty": "Phone code must be valid",
              "string.max": "Phone code must be valid",
              "any.required": "Phone code must be valid"
          })
      });
      
      let validate = schema.validate(data);
      
      if (!validate || validate.hasOwnProperty("error")) {
         console.error(`[URL: ${req.originalUrl}] [ERROR:${JSON.stringify(validate.error.details)}]`);
         return SendResponse.sendErrorMessage(res, validate.error.details[0].message);
      }
      

      【讨论】:

      • 但是您希望一个属性中的所有故障都出现一个错误。这段代码将如何处理它?
      猜你喜欢
      • 1970-01-01
      • 2018-07-21
      • 2021-08-12
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      相关资源
      最近更新 更多