目錄
後面會繼續更新幾篇,具體目錄如下
前言
這些文章就是記錄點的東西,當筆記的,儘量簡短實用;今天簡單寫一下假設eggjs開發一個api介面伺服器,並根據各種情況正確返回json格式,優雅的實現異常處理;
為什麼需要錯誤處理
- 防止程式掛掉
- 告訴使用者錯誤資訊
- 方便開發除錯,定位問題
- api介面伺服器規定的返回資料結構
幾種錯誤
- 程式執行錯誤 如500錯誤
- 開發自己丟擲的異常錯誤
- 404錯誤
自己實現中介軟體
我們先自己實現一箇中介軟體來處理錯誤,下一個話題說如何避免造輪子
這裡我自己建立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錯誤)
但這個中介軟體有個小問題,在404時候的處理並不友好,並沒有滿足要求返回json
避免重複造輪子
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}
}
複製程式碼
總結
綜上就是簡單介紹了一下egg中優雅處理各種異常的方式了;下一篇將簡單記錄下如何實現jwt認證