淺析Node中Express的錯誤處理中間件

本篇文章帶大家了解一下Node中Express的錯誤處理中間件,介紹一下定義錯誤處理中間件、與 async/await 一起使用的方法,希望對大家有所幫助!

淺析Node中Express的錯誤處理中間件

文章插圖

Express 的錯誤處理中間件可幫助您處理錯誤,而無需重復同樣的工作 。 假設您直接在 Express 路由處理程序中處理錯誤:
app.put('/user/:id', async (req, res) => { let user try { user = await User.findOneAndUpdate({ _id: req.params.id }, req.body) } catch (err) { return res.status(err.status || 500).json({ message: err.message }) } return res.json({ user })})上面的代碼可以正常工作,但是,如果有數百個接口呢,那么錯誤處理邏輯將變得不可維護,因為它被重復了數百次 。
定義錯誤處理中間件Express 根據中間件函數采用的參數數量分為不同的類型 。 接受 4 個參數的中間件函數被定義為錯誤處理中間件,只有在發生錯誤時才會被調用 。
const app = require('express')()app.get('*', function routeHandler() { // 此中間件拋出一個錯誤,Express 將直接轉到下一個錯誤處理程序 throw new Error('Oops!')})app.get('*', (req, res, next) => { // 此中間件不是錯誤處理程序(只有3個參數),Express 將跳過它,因為之前的中間件中存在錯誤 console.log('這里不會打印')})// 您的函數必須接受 4 個參數,以便 Express 將其視為錯誤處理中間件 。 app.use((err, req, res, next) => { res.status(500).json({ message: err.message })})Express 會自動為您處理同步錯誤,如上面的 routeHandler() 方法 。 但是 Express 不處理異步錯誤 。 如果出現異步錯誤,則需要調用 next() 。
const app = require('express')()app.get('*', (req, res, next) => { // next() 方法告訴 Express 轉到鏈中的下一個中間件 。 // Express 不處理異步錯誤,因此您需要通過調用 next() 來報告錯誤 。 setImmediate(() => { next(new Error('Oops')) })})app.use((err, req, res, next) => { res.status(500).json({ message: err.message })})請記住,Express 中間件是按順序執行的 。 您應該在所有其他中間件之后,最后定義錯誤處理程序 。 否則,您的錯誤處理程序將不會被調用:
async/await 一起使用Express 無法捕獲 promise 的異常,Express 在 ES6 之前編寫,對于如何處理 async/await 它扔沒有好的解決方案 。
例如,下面的服務器永遠不會成功發送 HTTP 響應,因為 Promise reject 永遠不會得到處理:
const app = require('express')()app.get('*', (req, res, next) => { // 報告異步錯誤必須通過 next() return new Promise((resolve, reject) => { setImmediate(() => reject(new Error('woops'))) }).catch(next)})app.use((error, req, res, next) => { console.log('will not print') res.json({ message: error.message })})app.listen(3000)我們可以封裝或者使用現有的庫來進行捕獲 。
首先,我們先簡單封裝一個函數,將 async/await 與 Express 錯誤處理中間件聯系起來 。
注意:異步函數會返回 Promise,因此您需要確保 catch() 所有錯誤并將其傳遞給 next() 。
function wrapAsync(fn) { return function(req, res, next) { fn(req, res, next).catch(next) }}app.get('*', wrapAsync(async (req, res) => { await new Promise(resolve => setTimeout(() => resolve(), 50)) // Async error! throw new Error('woops')}))使用第三方庫 express-async-errors,一個簡單的 ES6 async/await 支持 hack:
require('express-async-errors')app.get('*', async (req, res, next) => { await new Promise((resolve) => setTimeout(() => resolve(), 50)) throw new Error('woops')})最后Express 錯誤處理中間件允許您以最大化關注點分離的方式處理錯誤 。 您不需要處理業務邏輯中的錯誤,如果使用 async/await,甚至不需要 try/catch 。 這些錯誤將出現在您的錯誤處理程序中,然后您的錯誤處理程序可以決定如何響應請求 。 確保在下一個 Express 應用程序中充分利用這一強大功能!
更多node相關知識,請訪問:nodejs 教程!
以上就是淺析Node中Express的錯誤處理中間件的詳細內容,更多請關注電腦自學網其它相關文章!
【淺析Node中Express的錯誤處理中間件】

推薦閱讀