对任何字符串类型错误显示相同的自定义错误消息[EXPRESS + JOI]

时间:2019-12-17 07:32:08

标签: node.js express hapijs joi

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

对于自定义错误消息,我使用.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.

2 个答案:

答案 0 :(得分:2)

这是我在JOI中实现自定义错误消息的方式。只需从validate对象获取消息。它简单而有效。

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);
}

答案 1 :(得分:0)

我想Joi现在不可能直接做到这一点。您可以使用.error(new Error(errMsg))发送回一个错误,以防phoneCode出现问题:

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}

但是请记住,在ValidationError的情况下,Joi会发回.messages(),但是现在它会发回Error。您可以根据需要设置错误的格式,我只是在错误末尾加了空格。

具有可执行代码:https://runkit.com/rvypandey/5e394a3b78e4df0013483771

的RunKit