Hapi / Joi验证错误日志

时间:2018-02-15 06:45:31

标签: node.js hapijs joi

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

var content = new WebDriverWait(currentDriver,defaultTimeout).Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div.modal.class1.class2:nth-child(2)"))).GetAttribute("innerHTML");

当我向此端点发送POST请求时,其中包含无效数据,显示错误

POST请求

   {
// 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()
             }
           }
        }
      }

错误

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

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

你可以用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
            }
        }
  });

答案 2 :(得分:0)

我认为您可以提供自定义错误消息

for i, x in enumerate(D1_inv):
    D1_inv[i] = round(x, 4)