express异常捕获怎样做?express异步函数使用这些要知
Admin 2021-10-13 群英技术资讯 1073 次浏览
这篇文章主要给大家介绍express异步函数做express异常捕获的内容,本文对大家学习express异步函数及使用有一定的帮助,感兴趣的朋友可以了解看看,接下来就跟随小编来学习吧。
在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异常捕获有帮助,想要了解更多express异步函数的使用,大家可以关注群英网络其它相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
JavaScript 函数提供两个接口实现与外界的交互,其中参数作为入口,接收外界信息;返回值作为出口,把运算结果反馈给外界。下面本篇文章带大家了解一下JavaScript函数返回值,浅析下return语句的用法,希望对大家有所帮助!
这篇文章主要介绍了JavaScript 中的for/of, for/in,在 JavaScript中,for 循环有几种常见的写法,西阿棉文章有写法的详细内容,需要的朋友可以参考一下
这篇文章主要为大家详细介绍了javascript实现图片轮播简单效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
目录概念介绍第一种:递归方式(推荐,项目中最安全最常用)第二种:JSON.stringify() ;(这个不推荐使用,有坑)第三种:使用第三方库lodash中的cloneDeep()方法第四种:JQuery的extend()方法进行深拷贝(推荐在JQ中使用)总结概念介绍深拷贝:在堆内存中重新开辟一个存储空间,完全克隆一
今天我们来了解JavaScript中this指向的内容,下文会给大家介绍this的指向问题以及改变this指向的方法,对于学习和理解this的指向有一定的帮助,需要的朋友可以参考了解看看,接下来就跟随小编一起学习一下吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008