尽管将 abort early 设置为 false,JOI 验证并未返回所有错误
JOI validation is not returning all the errors despite setting abort early false
我一直在尝试通过 joi 模式验证我的有效载荷。但它没有返回我在模式中编写的错误,而是只显示一个错误。即使我给 name=int 这样的有效载荷,尽管给第二个输入也就是用户名一个整数值,但只显示一个自定义错误:
{
"statusCode": 400,
"error": "Bad Request",
"message": "name expecting a string"
}
它应该打印
{
"statusCode": 400,
"error": "Bad Request",
"message": "name expecting a string"/"username expecting a string"
}
这是我的代码:
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,
},
我希望 postman 显示所有错误信息,而不仅仅是第一条错误信息。而且我也不想使用默认错误消息 child must be string/int
类型错误,这就是我使用新错误的原因。我已经阅读了所有关于该错误的 Whosebug 文章,但没有解决我的问题。这是我使用的 hapi 和 joi 版本:
@hapi/joi: ^15.0.3,
@hapi/hapi: ^18.3.1,
据我所知,每个 Joi 错误都会抛出一个 ValidationError
,其中包含一个键 details,这是一个错误数组,每个错误,除其他外,有您的自定义错误消息,并且通过在您的架构中执行 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"
}
我一直在尝试通过 joi 模式验证我的有效载荷。但它没有返回我在模式中编写的错误,而是只显示一个错误。即使我给 name=int 这样的有效载荷,尽管给第二个输入也就是用户名一个整数值,但只显示一个自定义错误:
{ "statusCode": 400,
"error": "Bad Request",
"message": "name expecting a string" }
它应该打印
{ "statusCode": 400,
"error": "Bad Request",
"message": "name expecting a string"/"username expecting a string" }
这是我的代码: 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,
},
我希望 postman 显示所有错误信息,而不仅仅是第一条错误信息。而且我也不想使用默认错误消息 child must be string/int
类型错误,这就是我使用新错误的原因。我已经阅读了所有关于该错误的 Whosebug 文章,但没有解决我的问题。这是我使用的 hapi 和 joi 版本:
@hapi/joi: ^15.0.3,
@hapi/hapi: ^18.3.1,
据我所知,每个 Joi 错误都会抛出一个 ValidationError
,其中包含一个键 details,这是一个错误数组,每个错误,除其他外,有您的自定义错误消息,并且通过在您的架构中执行 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"
}