尽管将 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"
}