我一直在尝试通过joi模式验证我的有效负载。但是它没有返回我在模式中编写的错误,而是仅显示一个错误。即使给了像name = int这样的有效负载,尽管给第二个输入aka用户名提供了一个整数值,但也只出现了一个自定义错误:
{ “ statusCode”:400,
“错误”:“错误请求”,
“ message”:“名称需要字符串” }
它应该已经打印了
{ “ statusCode”:400,
“错误”:“错误请求”,
“ message”:“需要字符串的名称” /“需要字符串的用户名” }
这是我的代码: server.js
const server = Hapi.server({
port: 3000,
routes: {
validate: {
options: {
abortEarly: false
},
failAction: async (request, response, err) => {
throw Boom.badRequest(err.message);
},
},
},
});
joi-schmea.js
const NamePayload = Joi.object().keys({
name: Joi.string().required().error(new Error('name expecting a string')),
username: Joi.string().required().error(new Error('username expecting a string')),
age: Joi.integer().required().error(new Error('age expecting a number')),
});
routes.js:
validate: {
payload: Schema.NamePayload,
},
我希望邮递员不仅显示第一条错误消息,还显示所有错误消息。而且我也不想使用默认错误消息 child must be string/int
类型错误,这就是我使用新错误的原因。我已经阅读了有关该错误的所有stackoverflow文章,但没有任何解决我的问题的方法。这是使用的hapi和joi版本:
@ hapi / joi:^ 15.0.3,
@ hapi / hapi:^ 18.3.1,
答案 0 :(得分:0)
据我所知,每个Joi错误都会引发一个ValidationError
,其中包含一个键详细信息,该键是一系列错误,每个错误除其他外,都有您的自定义错误消息,然后在您的架构中执行 new Error(),您将覆盖该关键详细信息。因此,这是我建议您执行的操作:
为此替换您的架构错误:
Joi.object().keys({
name: Joi.string().required().error(() => 'name expecting a string'),
username: Joi.string().required().error(() => 'username expecting a string'),
age: Joi.number().integer().required().error(() => 'age expecting a number'),
});
然后在您的 failAction 中合并 err.details 内部的那些消息:
failAction: async (request, response, err) => {
throw Boom.badRequest(err.details.map((error) => error.message).join('/'));
}
对于此有效载荷:
{
"name": 10
}
您将收到以下答复:
{
"statusCode": 400,
"error": "Bad Request",
"message": "name expecting a string/username expecting a string/age expecting a number"
}