摘要:處理異常是編程非常重要的一點。我們的程序依賴于第三方服務數據庫以及我們的用戶,一切都不可預料。為了處理這些錯誤,需要添加一個中間件,它有個參數這樣,我們就可以使用中間件統一處理錯誤了。
譯者按:根據墨菲定律:“有可能出錯的事情,就會出錯”。那么,既然代碼必然會出錯,我們就應該處理好異常。
原文: How to handle errors in Express
譯者:Fundebug
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。
處理異常是編程非常重要的一點。我們的程序依賴于第三方服務、數據庫以及我們的用戶,一切都不可預料。數據庫可能會宕機,第三方服務可能會崩潰,用戶可能會使用錯誤的參數調用我們的接口。
為了處理各種復雜的情況,我們必須處理好代碼異常,下面是代碼示例:
app.get("/users/:id", (req, res) => { const userId = req.params.id if (!userId) { return res.sendStatus(400).json({ error: "Missing id" }) } Users.get(userId, (err, user) => { if (err) { return res.sendStatus(500).json(err) } res.send(users) }) })
代碼中處理了異常,但是存在問題:
在多處代碼處理異常
沒有使用Express的異常處理模塊來統一處理異常
接下來,我們來一步步優化代碼異常處理。
Express異常處理中間件所有Express的路由處理函數都有第三個參數next,它可以用來調用下一個中間件,也可以將錯誤傳遞給錯誤處理中間件:
app.get("/users/:id", (req, res, next) => { const userId = req.params.id if (!userId) { const error = new Error("missing id") error.httpStatusCode = 400 return next(error) } Users.get(userId, (err, user) => { if (err) { err.httpStatusCode = 500 return next(err) } res.send(users) }) })
使用next(err),Express就知道出錯了,并把這個錯誤傳遞給錯誤處理模塊。為了處理這些錯誤,需要添加一個中間件,它有4個參數:
app.use((err, req, res, next) => { // log the error... res.sendStatus(err.httpStatusCode).json(err) })
這樣,我們就可以使用中間件統一處理錯誤了。但是,現在的代碼有些重復:創建錯誤,指定HTTP狀態碼,使用next(err)...
Fundebug是全棧JavaScript錯誤監控平臺,支持各種前端和后端框架,可以幫助您第一時間發現BUG!
boomboom是一個兼容HTTP的錯誤對象,他提供了一些標準的HTTP錯誤,比如400(參數錯誤)等。
const boom = require("boom") app.get("/users/:id", (req, res, next) => { const userId = req.params.id if (!userId) { return next(boom.badRequest("missing id")) } Users.get(userId, (err, user) => { if (err) { return next(boom.badImplementation(err)) } res.send(users) }) })
錯誤處理中間件需要稍作修改:
app.use((err, req, res, next) => { if (err.isServer) { // log the error... // probably you don"t want to log unauthorized access // or do you? } return res.status(err.output.statusCode).json(err.output.payload); })Async/Await錯誤處理
使用Async/Await之后,可以這樣處理Express異常:
將中間件使用Promise封裝起來,使用catch統一處理異常
在中間件中,直接拋出異常就可以了
const boom = require("boom"); // wrapper for our async route handlers // probably you want to move it to a new file const asyncMiddleware = fn => (req, res, next) => { Promise.resolve(fn(req, res, next)).catch((err) => { if (!err.isBoom) { return next(boom.badImplementation(err)); } next(err); }); }; // the async route handler app.get("/users/:id", asyncMiddleware(async (req, res) => { const userId = req.params.id if (!userId) { throw boom.badRequest("missing id") } const user = await Users.get(userId) res.json(user) }))參考
驗證HTTP請求參數可以使用joi模塊
打印日志可以使用winston或者pino模塊
版權聲明:
轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/12/06/handle-express-error/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90461.html
摘要:第一個是,是你傳遞給異常的構造函數的參數,比如你可以使用屬性來訪問到該消息第二個參數是異常堆棧跟蹤,非常重要。異常產生后能在后端正確處理是的關鍵部分。我將向你展示自定義構造函數和錯誤代碼的方法,我們可以輕松地將其傳遞給前端或任何調用者。 By Lukas Gisder-Dubé | nov 14, 2018 原文 接著我上一篇文章,我想談談異常。我肯定你之前也聽過——異常是個好東西。一...
摘要:又或者反過來,把錯誤當成異常來處理。當然,我猜它的目的,應該也是為了能實現錯誤與異常之間優雅轉換而添加的。至此,錯誤與異常的學習基本完畢。 這話題已經沒有什么新意了,這里只是做做筆記,作為思路的一種整理,也以便后續忘了可以回來這里查找。 錯誤 以下是 PHP 最常見的幾種錯誤: // E_NOTICE echo $a; // E_WARNING echo 100 / 0; clas...
摘要:異常異常的概述和分類異常的概述異常就是程序在運行過程中出現的錯誤。運行時異常就是程序員所犯的錯誤,需要回來修改代碼。獲取異常類名和異常信息,返回字符串。如果路徑名不同,就是改名并剪切。刪除注意事項中的刪除不走回收站。 1_異常(異常的概述和分類) A:異常的概述 異常就是Java程序在運行過程中出現的錯誤。 B:異常的分類 通過API查看Throwable Error 服務...
摘要:在掘金摸魚的時候看到了一個題第題搜索如何防抖,如何處理中文輸入,感覺挺有意思的。測試地址事件輸入法事件輸入法的第一個字母時觸發。輸入法狀態輸入內容。輸入法選擇之后觸發。 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現在前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水平,打牢基礎知識的中心思想,我...
摘要:在掘金摸魚的時候看到了一個題第題搜索如何防抖,如何處理中文輸入,感覺挺有意思的。測試地址事件輸入法事件輸入法的第一個字母時觸發。輸入法狀態輸入內容。輸入法選擇之后觸發。 前端最基礎的就是 HTML+CSS+Javascript。掌握了這三門技術就算入門,但也僅僅是入門,現在前端開發的定義已經遠遠不止這些。前端小課堂(HTML/CSS/JS),本著提升技術水平,打牢基礎知識的中心思想,我...
閱讀 3485·2023-04-25 21:43
閱讀 3102·2019-08-29 17:04
閱讀 802·2019-08-29 16:32
閱讀 1540·2019-08-29 15:16
閱讀 2151·2019-08-29 14:09
閱讀 2740·2019-08-29 13:07
閱讀 1629·2019-08-26 13:32
閱讀 1325·2019-08-26 12:00