【问题标题】:Hapi/Joi validation error logHapi/Joi 验证错误日志
【发布时间】:2018-07-25 20:40:06
【问题描述】:

我正在使用 hapi js 和 couchbase 开发一个 API。我正在使用 log4js 记录错误。

   {
// Add a user level
        method: 'POST',
        path: '/api/v1/userlevel',
        config: {
          handler: (request, reply) => {
            const userlevel = new Userlevel(request.payload);
            userlevel.save((err) =>{
              if(err) {
                return reply({
                  status: 400,
                  message: err.message
                }).code(400);
                // logger.error(err);
              }
              // logger.debug(reply);
              return reply(userlevel).code(201);
            });
          },
           validate: {
             payload: {
               group_id: Joi.string(),
               name: Joi.string(),
               status: Joi.string(),
               index_id: Joi.number(),
               device_id: Joi.string(),
               created_at: Joi.string(),
               updated_at: Joi.string(),
               sys_version: Joi.string()
             }
           }
        }
      }

当我使用无效数据向此端点发送 POST 请求时,它显示错误

POST 请求

{ 
 "group_id" : "test1",
 "name" : "test1",
 "status":"test1",
 "index_id":1,
 "device_id":"test1",
 "created_at":7,
 "updated_at":7,
 "sys_version":7
}

错误

{"statusCode":400,"error":"Bad Request","message":"child \"created_at\" fails because [\"created_at\" must be a string]","validation":{"source":"payload","keys":["created_at"]}}

我需要记录此错误消息。我试图找到这条消息产生的地方。但我找不到它。请帮忙。提前谢谢你。

【问题讨论】:

  • 在您的 POST 请求中,created_atnumber,因此 JOI 验证中的错误。
  • 我是故意这样做的。请再次阅读主题。
  • OP 正在发送无效数据,因为 OP 想要记录错误。
  • logger.error(err) 应该在 return 之前记录
  • 已经试过了。这不是“joi”产生的错误

标签: node.js hapijs joi


【解决方案1】:

如果您愿意迁移到 Hapi 17,则以下内容将起作用。如果您仔细阅读文档,很可能会有类似的 Hapi 16 解决方案。

如果路由验证失败,您可以使用 failAction 回调方法,这里似乎是记录错误的最佳位置。

const config = {
    routes: {
        validate: {
            failAction: async (request, h, err) =>
            {
                if (err.isJoi)
                {
                    // do something with error
                    console.log(err.message);
                }

                throw err;
            }
        }
    }
};

const server = new Hapi.Server(config);

【讨论】:

  • 知道如何记录收到的有效载荷吗?错误消息包含错误键,但不包含实际有效负载。
  • console.log(request.payload);?
【解决方案2】:

您可以使用 Hapi 16 以几乎相同的方式实现这一点,见下文:

server.route({
method: 'GET',
path: '/what/ever,
handler: function(request, reply) {
},
config: {
        validate: {
            payload: {},
            failAction: function(request, reply, source, error) {
// do your stuff here
// you should also reply something
            }
        }
  });

【讨论】:

    【解决方案3】:

    我认为你可以提供自定义错误消息更好

    {
        method: 'POST',
        path: '/api/v1/userlevel',
        config: {
          handler: (request, reply) => {
            const userlevel = new Userlevel(request.payload);
            userlevel.save((err) =>{
              if(err) {
                return reply({
                  status: 400,
                  message: err.message
                }).code(400);
                // logger.error(err);
              }
              // logger.debug(reply);
              return reply(userlevel).code(201);
            });
          },
           validate: {
             payload: {
               group_id: Joi.string().error(new Error('custom message')),
               name: Joi.string().error(new Error('custom message')),
               status: Joi.string().error(new Error('custom message')),
               index_id: Joi.number().error(new Error('custom message')),
               device_id: Joi.string().error(new Error('custom message')),
               created_at: Joi.string().error(new Error('custom message')),
               updated_at: Joi.string().error(new Error('custom message')),
               sys_version: Joi.string().error(new Error('custom message'))
             }
           }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 2015-04-29
      • 2018-09-24
      • 1970-01-01
      • 2013-10-19
      • 2019-05-05
      • 2021-07-25
      • 2019-10-10
      • 2020-05-30
      • 2018-05-25
      相关资源
      最近更新 更多