国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

NodeJS處理Express中異步錯(cuò)誤

2024-05-06 15:19:21
字體:
供稿:網(wǎng)友

摘要

比起回調(diào)函數(shù),使用 Promise 來處理異步錯(cuò)誤要顯得優(yōu)雅許多。

結(jié)合 Express 內(nèi)置的錯(cuò)誤處理機(jī)制和 Promise 極大地降低產(chǎn)生未捕獲錯(cuò)誤(uncaught exception)的可能性。

Promise 在ES6中是默認(rèn)選項(xiàng)。如果使用 Babel 轉(zhuǎn)譯,它也可以與 Generators 或者 Async/Await 相結(jié)合。

本文主要闡述如何在 Express 中使用錯(cuò)誤處理中間件(error-handling middleware)來高效處理異步錯(cuò)誤。在 Github 上有對(duì)應(yīng) 代碼實(shí)例 可供參考。

首先,讓我們一起了解 Express 提供的開箱即用的錯(cuò)誤處理工具。然后,我們將探討如何使用 Promise, Generators 以及 ES7 的 async/await 來簡(jiǎn)化錯(cuò)誤處理流程。

Express 內(nèi)置的異步錯(cuò)誤處理

在默認(rèn)情況下,Express 會(huì)捕獲所有在路由處理函數(shù)中的拋出的異常,然后將它傳給下一個(gè)錯(cuò)誤處理中間件:

app.get('/', function (req, res) { throw new Error('oh no!')})app.use(function (err, req, res, next) { console.log(err.message) // 噢!不!})

對(duì)于同步執(zhí)行的代碼,以上的處理已經(jīng)足夠簡(jiǎn)單。然而,當(dāng)異步程序在執(zhí)行時(shí)拋出異常的情況,Express 就無能為力。原因在于當(dāng)你的程序開始執(zhí)行回調(diào)函數(shù)時(shí),它原來的棧信息已經(jīng)丟失。

app.get('/', function (req, res) { queryDb(function (er, data) {  if (er) throw er })})app.use(function (err, req, res, next) { // 這里拿不到錯(cuò)誤信息})

對(duì)于這種情況,可以使用 next 函數(shù)來將錯(cuò)誤傳遞給下一個(gè)錯(cuò)誤處理中間件

app.get('/', function (req, res, next) { queryDb(function (err, data) {  if (err) return next(err)  // 處理數(shù)據(jù)  makeCsv(data, function (err, csv) {   if (err) return next(err)   // 處理 csv  }) })})app.use(function (err, req, res, next) { // 處理錯(cuò)誤})

使用這種方法雖然一時(shí)爽,卻帶來了兩個(gè)問題:

你需要顯式地在錯(cuò)誤處理中間件中分別處理不同的異常。

一些隱式異常并沒有被處理(如嘗試獲取一個(gè)對(duì)象并不存在的屬性)

利用 Promise 傳遞異步錯(cuò)誤

在異步執(zhí)行的程序中使用 Promise 處理任何顯式或隱式的異常情況,只需要在 Promise 鏈尾加上 .catch(next) 即可。

app.get('/', function (req, res, next) { // do some sync stuff queryDb()  .then(function (data) {   // 處理數(shù)據(jù)   return makeCsv(data)  })  .then(function (csv) {   // 處理 csv  })  .catch(next)})app.use(function (err, req, res, next) { // 處理錯(cuò)誤})

現(xiàn)在,所有異步和同步程序都將被傳遞到錯(cuò)誤處理中間件。棒棒的。

雖然 Promise 讓異步錯(cuò)誤的傳遞變得容易,但這樣的代碼仍然有一些冗長(zhǎng)和刻板。這時(shí)候 promise generator 就派上了用場(chǎng)。

用 Generators 簡(jiǎn)化代碼

如果你使用的環(huán)境原生支持 Generators,你可以手動(dòng)實(shí)現(xiàn)以下的功能。不過這里我們將借用 Bluebird.coroutine 來說明如何使用 Promise generator 來簡(jiǎn)化剛才的代碼。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 历史| 大竹县| 牙克石市| 通榆县| 兴宁市| 双牌县| 宿松县| 三河市| 衡东县| 龙口市| 凤庆县| 民勤县| 门头沟区| 东阳市| 海宁市| 乐昌市| 正宁县| 紫阳县| 汝阳县| 靖宇县| 谷城县| 江都市| 威信县| 肥乡县| 衡南县| 会同县| 江油市| 宣化县| 丰城市| 沅江市| 田阳县| 洞头县| 盐池县| 泽普县| 黔江区| 额济纳旗| 淮阳县| 陇西县| 贵港市| 太和县| 四会市|