【发布时间】:2020-01-26 10:38:03
【问题描述】:
我正在尝试从我的 Joi 验证架构返回多个自定义错误消息。这是架构
const Joi = require("@hapi/joi");
const string = Joi.string();
const emailSchema = string.email();
const usernameSchema = string
.min(3)
.max(30)
.error(() => "Username must be between 3 and 30 characters");
const passwordSchema = string
.min(6)
.error(() => "Password must be at least 6 characters");
const confirmPasswordSchema = Joi.valid(Joi.ref("passwordSchema")).error(
() => "Passwords must match"
);
const localRegistrationSchema = Joi.object().keys({
email: emailSchema.required().error(() => "Email is required"),
username: usernameSchema.required().error(() => "Username is required"),
password: passwordSchema.required().error(() => "Password is required"),
confirmPassword: confirmPasswordSchema
});
这是我使用架构的地方
const { error } = localRegistrationSchema.validate(req.body, {
abortEarly: false
});
console.log(error);
if (error) throw Boom.boomify(error);
但我不断收到 TypeError: Cannot read property 'filter' of undefined 这似乎是由
details.push({
message,
path: item.path.filter((v) => typeof v !== 'object'),
type: item.code,
context: item.local
});
这是 Joi 错误处理代码的一部分
当我不附加 .error() 部分时,我没有收到此错误,但如果我使用 .error(new Error("custom error message") 则无法显示一个以上的错误
我不知道出了什么问题,也无法找到任何其他方式来返回多个自定义错误消息以正常工作
【问题讨论】:
-
Joel Jacobson 我找到了一个更优雅的解决方案。您可以使用
Joi.any.messages()选项。有关完整示例,请参阅:stackoverflow.com/a/58198097/5536304 -
谢谢!!这太棒了。但是,我确实发现了一个警告,它也会影响您提供的原始代码以及您链接的示例中的代码。当您执行 string().required() 时,它会引发 string.empty 错误而不是 any.required 错误,因此检查 any.required 不起作用。您必须检查 string.empty。不知道其他类型是不是也一样。
标签: node.js express hapijs joi