内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

如何利用express異步函數(shù)對異常進行捕獲-創(chuàng)新互聯(lián)

這篇文章將為大家詳細講解有關(guān)如何利用express異步函數(shù)對異常進行捕獲,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)服務(wù)項目包括綦江網(wǎng)站建設(shè)、綦江網(wǎng)站制作、綦江網(wǎng)頁制作以及綦江網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,綦江網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到綦江省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

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

uncaughtException

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

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

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

asyncError();

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

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

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

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

而且Promise.reject也沒走到uncaughtException里面:

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

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

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

解決思路

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

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

接下來,在異步函數(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)錯誤就會被Error-handling中間件捕獲了

但是每次用到異步函數(shù)的時候都要包裹asyncHandler方法,真正用起來也不是很爽,這里推薦使用express-async-errors中間件,其原理是將express里面的中間全部包裹上一層asyncHandler方法,讓錯誤異常無所遁形,全部跑到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);
});

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

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ù)對異常進行捕獲就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

分享文章:如何利用express異步函數(shù)對異常進行捕獲-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://www.rwnh.cn/article6/ceipog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、網(wǎng)站收錄標簽優(yōu)化、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
浦城县| 光山县| 和龙市| 古浪县| 安图县| 桐乡市| 通渭县| 忻州市| 南部县| 灵山县| 渭南市| 资讯| 冷水江市| 凤山县| 汝城县| 同心县| 兰考县| 昌吉市| 迁西县| 奉贤区| 壶关县| 同江市| 马龙县| 教育| 公主岭市| 淮南市| 上高县| 苏州市| 太湖县| 龙胜| 华安县| 天台县| 镇赉县| 安西县| 湘阴县| 东阳市| 抚顺县| 万宁市| 陇川县| 乡城县| 河西区|