express异步异常的处理
发布于 8 年前 作者 vlwq 6303 次预览 最后一次回复是 7 年前 来自 问答
koa可以设置个全局中间件,try catch然后抛出错误,因为中间件走2次
express现在的办法
app.get('/index', async function (req, res) {
try {
//业务逻辑
await do something
} catch (err) {
res.send(e.message)
}
});
每个路由都要手动写try catch…路由如果用了promise或async,报错的时候监听500是没反应。后端是抛错了,但是浏览器端没反应,所以手动res.send错误信息
而搜了一下,除了try catch还有domain,都是4-5年前的文章如( http://cnodejs.org/topic/516b64596d38277306407936 ) ,现在还有什么方法吗,每个路由写try-catch有点烦。用的express,暂时不能换koa
9 回复
参考 http://expressjs.com/en/4x/api.html#app.use http://expressjs.com/en/guide/error-handling.html
中间件间调用,其实就是
function数组通过next链式调用:fn1中调用next,next就是fn2,fn2进入调用栈…也会按照这个逻辑出调用栈 代码中出现了异常,如果在当前上下文中没有try-catch,异常就会向调用栈中的上一层函数冒泡 理清执行顺序后,在合适的地方加入try-catch就会抓到你要的exception所以你可以在
app级路由前加一个中间件处理,也可以在路由级内加前置处理,都是有给你加切面机会的ps:
koa的中间件function只运行一次。我之前回答过类似问题,我就把我之前的答案搬运过来吧,其实可以用切面的方法来实现捕捉异常 我现在就是这样做的,说白了就是对每个方法都包装一层
可以用express-router-async 这个库 虽然知道这个库的人不多
@steambap 500进不去的…
@soda-wy koa一次么…app级别前置中间件没用
比如: router.post(’/list’, userRequired, controller.list);
userRequired是拦截是否登录的中间件,改成 try { next() } catch(e){…} 对下一步next(controller.list)的报错无法拦截
除非在这个路由文件,做个除了,包一一下controller.list
现在是后端拦截了,前端那边接口没反应,需要用到res
@zy445566 后端是能catch到error的,看
我意思是后端报错了,但是前端一直是请求状态,所以catch的时候,我手动res.send错误信息给浏览器了,不然前端那边一直没反应
@realcrazysun npm搜索到了一个express-async-errors , 已经解决,谢谢。你这个没搜到…
楼主解决了吗,我也遇到同样的问题了,每个路由写try-catch很烦