尽管将中止设置为false

时间:2019-05-29 07:32:14

标签: javascript node.js hapijs joi

我一直在尝试通过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,

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"
}