我有两个字段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.
答案 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