Egg優雅的實現異常處理

莫珂發表於2019-10-27

目錄

後面會繼續更新幾篇,具體目錄如下

  1. Egg優雅的實現異常處理
  2. Egg實現JWT鑑權

前言

這些文章就是記錄點的東西,當筆記的,儘量簡短實用;今天簡單寫一下假設eggjs開發一個api介面伺服器,並根據各種情況正確返回json格式,優雅的實現異常處理;

為什麼需要錯誤處理

  1. 防止程式掛掉
  2. 告訴使用者錯誤資訊
  3. 方便開發除錯,定位問題
  4. api介面伺服器規定的返回資料結構

幾種錯誤

  1. 程式執行錯誤 如500錯誤
  2. 開發自己丟擲的異常錯誤
  3. 404錯誤

自己實現中介軟體

我們先自己實現一箇中介軟體來處理錯誤,下一個話題說如何避免造輪子

egg demo的結構示意圖
這裡我自己建立middleware目錄,用於儲存中介軟體

module.exports = options => {
  return async(ctx, next) => {
    try {
      await next();
    } catch (err) {
    // 我們就簡單的try catch處理一下異常,同實因為上述提到的第一種程式執行錯誤無status和statusCode,因為這裡有500處理
      ctx.status = err.status || err.statusCode || 500;
      ctx.body = {
        message: err.message,
      }
    }
  }
}
複製程式碼

上述就是一個簡單的自定義錯誤中介軟體處理,通過這個中介軟體我們可以實現類似下圖的錯誤處理(這裡我們在controller中通過koa自帶ctx.throw方法丟擲403錯誤)

postman中403測試結果

但這個中介軟體有個小問題,在404時候的處理並不友好,並沒有滿足要求返回json

404返回結果

避免重複造輪子

egg基於koa,這裡我們沒必要重複造輪子,可以使用社群一個優秀的輪子koa-json-err;感興趣可以點選連結去github閱讀更多

egg中使用koa中介軟體

// middlware/error.js
module.exports = require('koa-json-error');
複製程式碼
// config/config.xxx.js中可以配置
config.middleware = ['error'];
config.error = {
    // 這裡使用appInfo.env來判斷環境,僅僅在非生產環境下開啟堆疊資訊,用於除錯
    postFormat: (e, { stack, ...rest}) => appInfo.env === 'prod' ? rest: { stack, ...rest}
}
複製程式碼

使用中間後的404處理

總結

綜上就是簡單介紹了一下egg中優雅處理各種異常的方式了;下一篇將簡單記錄下如何實現jwt認證

相關文章