时间:2021-05-28
在express中时使用 Async/await 编写异步代码时,每个 async 函数都要包裹在try/catch中,代码量多了看着冗余不优雅,express又不像koa的异步机制可以订阅全局的error事件,为了解决这个问题,需要写个捕获异步函数异常的中间件。
开始能想到的肯定是try/catch了,但是也想过能否使用nodejs提供的uncaughtException事件,在全局捕获异常,例如下面的代码:
process.on("uncaughtException", (err) => console.log("uncaught Exception"));const asyncError=()=>{ throw new Error("some Error");}asyncError();asyncError方法里面抛出的异常会被 uncaughtException订阅,但是在异步函数中,并没走到 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处理异步错误不太合适,一方面没法捕获和定位上下文错误,另一方面也没法将错误异常提供给中间件函数处理
要处理express中的异步函数错误,最好的方法当然是编写处理异常的中间件了,try/catch开路,包裹中间件方法,catch到的异常直接交给next函数处理,代码如下:
const asyncHandler = fn =>{ return (req,res,next)=>{ try{ fn(req,res,next) }catch(next) }}module.exports = asyncHandler;接下来,在异步函数中引入中间件处理:
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函数,如果出现错误就会被Error-handling中间件捕获了
但是每次用到异步函数的时候都要包裹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);});接下来的在异步函数中,就不用都包裹上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);});~~~~参考链接:
到此这篇关于express异步函数异常捕获示例的文章就介绍到这了,更多相关express异步函数异常捕获内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
摘要比起回调函数,使用Promise来处理异步错误要显得优雅许多。结合Express内置的错误处理机制和Promise极大地降低产生未捕获错误(uncaught
详解Java中多线程异常捕获Runnable的实现1、背景:Java多线程异常不向主线程抛,自己处理,外部捕获不了异常。所以要实现主线程对子线程异常的捕获。2、
Android捕获运行时异常详解Android异常分为两类:CheckedException和UnCheckedExceptionCheckException:
前言今天在开发过程中调用一个库函数结果库函数有throw操作,当前代码没有对throw进行捕获操作,导致进程在main函数中捕获到异常导致进程crash。所以借
问题怎样捕获代码中的所有异常?解决方案想要捕获所有的异常,可以直接捕获Exception即可:try:...exceptExceptionase:...log(