最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

express異步函數(shù)異常捕獲示例詳解

 更新時(shí)間:2020年11月30日 10:21:49   作者:chenwl  
這篇文章主要給大家介紹了關(guān)于express異步函數(shù)異常捕獲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在express中時(shí)使用 Async/await 編寫(xiě)異步代碼時(shí),每個(gè) async 函數(shù)都要包裹在try/catch中,代碼量多了看著冗余不優(yōu)雅,express又不像koa的異步機(jī)制可以訂閱全局的error事件,為了解決這個(gè)問(wèn)題,需要寫(xiě)個(gè)捕獲異步函數(shù)異常的中間件。

uncaughtException

開(kāi)始能想到的肯定是try/catch了,但是也想過(guò)能否使用nodejs提供的uncaughtException事件,在全局捕獲異常,例如下面的代碼:

process.on("uncaughtException", (err) => console.log("uncaught Exception"));

const asyncError=()=>{
 throw new Error("some Error");
}

asyncError();

asyncError方法里面拋出的異常會(huì)被 uncaughtException訂閱,但是在異步函數(shù)中,并沒(méi)走到 uncaughtException,還是會(huì)拋出異常:

process.on("uncaughtException", (err) => console.log("uncaught Exception"));

const asyncError=()=>{
 throw new Error("some Error");
}

(async ()=>{
 // 拋出異常
 asyncError();
})()

而且Promise.reject也沒(méi)走到uncaughtException里面:

const asyncError=()=>{
 return Promise.reject("some error")
}

(async ()=>{
 // 拋出異常
 await asyncError();
})()

所以在express中使用nodejs提供的uncaughtException處理異步錯(cuò)誤不太合適,一方面沒(méi)法捕獲和定位上下文錯(cuò)誤,另一方面也沒(méi)法將錯(cuò)誤異常提供給中間件函數(shù)處理

解決思路

要處理express中的異步函數(shù)錯(cuò)誤,最好的方法當(dāng)然是編寫(xiě)處理異常的中間件了,try/catch開(kāi)路,包裹中間件方法,catch到的異常直接交給next函數(shù)處理,代碼如下:

 const asyncHandler = fn =>{
 return (req,res,next)=>{
  try{
   fn(req,res,next)
  }catch(next)
 }
}
module.exports = asyncHandler;

接下來(lái),在異步函數(shù)中引入中間件處理:

app.use(asyncHandler(async(req, res, next) => {
 await authenticate(req);
 next();
}));

app.get('/async', asyncHandler(async(req, res) => {
 const result = await request('http://example.com');
 res.end(result);
}));

使用asyncHandler方法包裹的async/await函數(shù),如果出現(xiàn)錯(cuò)誤就會(huì)被Error-handling中間件捕獲了

但是每次用到異步函數(shù)的時(shí)候都要包裹asyncHandler方法,真正用起來(lái)也不是很爽,這里推薦使用express-async-errors中間件,其原理是將express里面的中間全部包裹上一層asyncHandler方法,讓錯(cuò)誤異常無(wú)所遁形,全部跑到Error-handling中間件。

前提是引入express后,先引入express-async-errors方法:

const express = require('express');
require('express-async-errors');
const User = require('./models/user');
const app = express();

app.get('/users', async (req, res) => {
 const users = await User.findAll();
 res.send(users);
});

接下來(lái)的在異步函數(shù)中,就不用都包裹上try/catch了,有錯(cuò)誤提前throw Error,寫(xiě)起代碼來(lái)美滋滋:

app.use(async (req, res) => {
 const user = await User.findByToken(req.get('authorization'));

 if (!user) throw Error("access denied");
});

app.use((err, req, res, next) => {
 if (err.message === 'access denied') {
 res.status(403);
 res.json({ error: err.message });
 }

 next(err);
});~~~~

參考鏈接:

到此這篇關(guān)于express異步函數(shù)異常捕獲示例的文章就介紹到這了,更多相關(guān)express異步函數(shù)異常捕獲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

离岛区| 泰和县| 朝阳区| 林州市| 毕节市| 台江县| 广河县| 哈巴河县| 昭通市| 尼玛县| 大竹县| 娄底市| 乳山市| 洮南市| 固原市| 安岳县| 阳谷县| 原平市| 辽源市| 子洲县| 会宁县| 天等县| 湖州市| 仲巴县| 绵竹市| 巴林左旗| 绥阳县| 噶尔县| 平顶山市| 舟山市| 石嘴山市| 临湘市| 贵德县| 五指山市| 定兴县| 阳西县| 高雄县| 禹城市| 眉山市| 伊宁市| 容城县|