Better express error

搭配 middleware 顯示更精準的 error message

愷開
De-Magazine
4 min readNov 7, 2017

--

相關 repo

在 express 開發時,如果遇到錯誤,通常是直接印在 error page 上,或者在 production 端直接導到 404, 500 page。

這雖然不是什麼值得一提的事,但說真的,看到這種頁面你會覺得開心嗎?

2017-11-08 1 53 22

熟悉 Ruby On Rails 開發的工程師,應該多少都用過 better_errors,或者 rails 本身內建的 error trace page 來 debug。

不過在 express 上,還沒有看到一個功能類似 better error 的 package,常常只能看這種醜不拉嘰的 error message 仰天長嘯。(或者已經有但我沒發現QQ)

於是,自己做了一個簡單的 middleware 處理這件事。其實本質上就是 bettor errors 的 express 實作啦

1. 分析錯誤訊息

仔細觀察後可以發現,錯誤訊息的格式是相當整齊規律的。首先,第一行為錯誤名稱與訊息,這通常是最重要的資訊。第二行以後則是調用 stack。at … 是某個函數的呼叫,括號內則是檔名與行數、row 的訊息。

簡單分析完錯誤訊息後,我們可以把純文字轉為比較有用的資訊。因此透過 split('\n'),再根據字串做簡單的正規表達式匹配,就能分成檔名與行數資訊了。

2. 顯示 Error

對於第一行的錯誤訊息,通常是最重要的資訊,因為程式碼就是在那邊噴錯的,因此對於第一行錯誤訊息,我們將他放在最顯眼的地方並且 highlight。

2017-11-08 2 05 36

而第二行之後的錯誤訊息,用顏色及大小來標示檔案名稱、行數以及調用的函式名稱。

2017-11-08 2 06 02

比起前面一坨黑黑的文字,這樣簡單的整理已經可以讓開發者可以一目了然到底發生了什麼事。

3. 顯示檔案內容

不過,除了顯示錯誤訊息之外,我們也希望能夠同時顯示對應的檔案內容,以及上下文有哪些。因此右半邊可以利用錯誤訊息中提供的檔案名稱與行數,顯示對應的檔案內容。

對於 nodejs 來說,只要透過 fs.readFileSync 就夠了。

這邊是透過很簡單的方式,直接印出前五行及後五行,更聰明的方式是透過像是 AST 之類的技巧,只印出對應到的 function 內容。不過現在我們直接印出前後五行的程式碼即可。

做一些調整與修改,大概長這樣:

2017-11-08 2 13 18

透過簡單的 highlight,讓開發者馬上知道出錯的地方在哪邊。

REPL

除了顯示 error 外,我們還希望這個頁面可以輸入一些簡單的程式,確認問題點後,再實際修改程式碼。

在 nodejs 當中,有個 VM 的模組,能夠讓你使用 V8 的 Virtual Machine contexts 執行給定的 code。透過這個模組,我們就能夠實現類似 REPL 的功能了!

把想要暴露的變數傳入 context 當中,在透過 POST 的方式讀取前端的 code,就可以很方便地達到 debug 的效果。

2017-11-08 2 19 51

(輸出還需要做一些調整)

全部整合!

2017-11-08 2 20 57

全部整合起來後,頁面大概會長這樣。

比起原本的純文字,雖然花了一些功調整頁面 style 與實現 REPL 的功能,不過讓 debug 的流程變得更加流暢了。

結論

express-error

詳細的實作在這個 repo 裏頭,最近如果比較有空會在將實作抽換為 middleware 的形式方便大家使用。也會逐漸優化整個 layout 與 code highlight 的部分,並且讓整個流程跟畫面更加流暢一些。 雖然不知道會過多久就是了 XD

如果有各種建議也歡迎提出 issue。

--

--

愷開
De-Magazine

(Medium 不再更新文章) https://blog.kalan.dev 軟體工程師 / Working in Fukuoka, Japan。 平時喜歡用程式探索各種可能性,用網頁說故事、創造工具,邁向更好的生活。