簡體   English   中英

Hapi / Joi驗證錯誤日志

[英]Hapi/Joi validation error log

我正在使用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"]}}

我需要記錄此錯誤消息。 我試圖找到這條消息產生的地方。 但我找不到它。 請幫忙。 先感謝您。

如果您願意遷移到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);

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

我認為你可以提供自定義錯誤消息

{
    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'))
         }
       }
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM