Egg優雅的實現異常處理

目錄

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

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

前言

這些文章就是記錄點的東西,當筆記的,儘可能簡短實用;今天簡單寫一下假設eggjs開發一個api接口服務器,並根據各類狀況正確返回json格式,優雅的實現異常處理;java

爲何須要錯誤處理

  1. 防止程序掛掉
  2. 告訴用戶錯誤信息
  3. 方便開發調試,定位問題
  4. api接口服務器規定的返回數據結構

幾種錯誤

  1. 程序運行錯誤 如500錯誤
  2. 開發本身拋出的異常錯誤
  3. 404錯誤

本身實現中間件

咱們先本身實現一箇中間件來處理錯誤,下一個話題說如何避免造輪子git

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錯誤) github

postman中403測試結果

但這個中間件有個小問題,在404時候的處理並不友好,並無知足要求返回json json

404返回結果

避免重複造輪子

egg基於koa,這裏咱們不必重複造輪子,可使用社區一個優秀的輪子koa-json-err;感興趣能夠點擊連接去github閱讀更多api

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認證服務器

相關文章
相關標籤/搜索