當前位置:
首頁 > 最新 > 統一處理錯誤異常來簡化web應用程序

統一處理錯誤異常來簡化web應用程序

你想要統一處理錯誤異常來簡化web應用程序。從Error繼承包括http狀態碼的錯誤類,並使用中間組件來處理基於content type的錯誤。JavaScript有Error的構造函數,你可以繼承它來表示特定類型的錯誤。在web開發中,一些錯誤越來越頻繁地出現了:不正確的網址、不正確的參數查詢參數或表單值、並發錯誤。這意味著你可以定義一些錯誤,來包括典型錯誤所提供的http代碼。 你應該調用next(err),而不是在http路由中分離出一個錯誤條件的處理分支。接下來的代碼會展示這一切是如何工作的。

在分離的文件中組織錯誤對象。

確保路由的處理聲明中包括了第三個參數,next。

如果資料庫API傳遞了一個錯誤,那麼便提交返回結果。

如果找不到記錄,創建一個合適的錯誤實例。

在這個例子中,處理錯誤的類已經在單獨的文件中定義,你可以在例子中找到。這個路由處理包括了第三個參數,next,在我們之前提到標準的req、res之後。

許多路由的處理程序會載入資料庫中的數據,無論是從MySQL、PostgreSQL、MongoDB或者Redis,所以這個例子是基於一個通用的資料庫非同步API的。如果資料庫API拋出一個錯誤,那麼提早返回,並且將錯誤對象作為第一個參數調用next。這會把錯誤傳遞給下一個中間件。這個路由處理器有另外一部分的邏輯——如果在資料庫中找不到記錄,那麼會實例化一個錯誤對象並使用next進行傳遞。下邊的列表展示了如何繼承一個Error

創建通用的http錯誤類。

使用util.inherits從Error繼承。

捕獲堆棧信息。

設置可以傳遞給瀏覽器的狀態碼。

新增的http錯誤可以從httpError繼承而來。

這裡我們有選擇性地創建了兩個類。不僅僅只是定義了NotFound錯誤,還創建了httpError類,並且從它繼承而來。這方便於我們跟蹤錯誤是否與http相關,或者它也可能是其他錯誤。HTTPError這個基礎的錯誤類可以從Error繼承而來。

在NotFound錯誤中,我們捕獲了堆棧跟蹤信息,來幫助調試,同時設置了一個可以反饋給瀏覽器的狀態碼。

下面顯示了如何在一個典型的Express應用程序中創建一個錯誤處理的中間件

如果在app.use使用了四個參數,那麼第一個參數是錯誤對象。

如果不是在測試模式中便列印堆棧跟蹤信息。

以期望的格式返回錯誤信息。

這個中間件相對簡單,但是它已經包括了我們在生產環境中發現的一些需要調整的東西。為了在next中獲取錯誤對象,請確保使用app.use回調函數的四個參數。同時請注意這個中間件在處理鏈條的最後,需要把它放在其他中間件和路由的定義之後。

可以選擇性地列印堆棧跟蹤信息,當特定的測試需要依賴錯誤信息時——錯誤作為測試的一部分被觸發,堆棧信息應該是不可見的,你不希望堆棧信息搞亂了測試的輸出。

因為需要在主要的應用文件中集中處理錯誤,所以根據條件返回不同的錯誤格式是一個很好的主意。如果應用提供HTML頁面以及JSON API,那麼這會是非常有用的。你可以使用app.format來處理,它用於檢查在請求的Accept頭部中的MIME type。JSON響應可能並不需要,但是你的API需要返回客戶端可以預知的符合規則的錯誤信息——如果當你請求JSON時突然響應的是HTML,那麼會很難處理。

在測試中,應該檢查這些錯誤是否是你所需要的。下邊的代碼片段展示了mocha測試來確保404時以所期望的格式返回了所期望的內容

檢查返回的狀態碼是否為期望的值。

設置Accept頭部來獲取JSON。

檢查body是否是期望的格式。

這個代碼片段包括了兩個請求。第一個用例是我們得到了一個404錯誤,第二個是設置Accept頭部來確保我們獲取的是JSON。這是SuperTest的一個實現,將在響應中返回JSON,斷言可以檢查來確保我們拿到的對象是我們期望的格式。這個例子的源碼可以在listings/web/error-handling中找到。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 行家匯 的精彩文章:

使用框架來創建RESTful的web服務
Browserify用於創建一個客戶端腳本
使用路由分離來把相關的路由拆分到各個模塊中
Node在shell中執行命令
Node的流和外部應用程序

TAG:行家匯 |

您可能感興趣

logo簡化處理後,你還認得嗎?
Pulumi開源基礎架構,能簡化AWS應用程序部署工作
我的if else代碼純凈無暇,一個字也不能簡化
簡化客戶與開發者合作過程,VR管理系統Varwin開始公測
AI演算法透明不是必須,黑箱和可解釋性可簡化為優化問題
蘋果iphone手機變更命名規則,簡化以重塑辨識度
Oculus暗示跨平台開發並非開放應用商店,而是簡化開發者工作流程
如何簡化操作流程
Twitter開始向一些用戶推出簡化的Web界面
VMware雲服務再次升級 簡化應用交付實現靈活管理
綜述簡化字的失誤,呼籲啟用正體字
簡化你的工作流程:Unity Hub
新一代iPhone是否應簡化命名以重塑品牌?
谷歌開源場景簡化工具Seurat,在一體機上實現更好渲染
Imagination全新GPU調試功能可簡化應用與遊戲開發
書法作品是寫簡化字還是繁體字?啟功先生這個表率做得好
書法能不能寫簡化字?
蘋果欲簡化新款iPhone命名 不再用數字編號
NetApp聯手思科推出全新 FlexPod 解決方案,簡化雲基礎架構和行業特定應用程序交付
「簡化式」的歐式風格,是怎樣一個調調?簡約而不簡單