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
app.use(function(err, req, res, next) {
console.error(err.stack);
res.status(500).send('Something broke!');
});
参考 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
只运行一次。
我之前回答过类似问题,我就把我之前的答案搬运过来吧,其实可以用切面的方法来实现捕捉异常 我现在就是这样做的,说白了就是对每个方法都包装一层
class A{
method1(a,b)
{
console.log(`a+b=${a+b}`);
console.log("no error,method1");
}
method2()
{
throw "no error,method2";
}
}
//生成实例的方法你可以放到工厂类里面实现
let a = new Proxy(new A(),{
get: function (target, key){
return function(...arg){
try{
target[key](...arg);
} catch(err){
console.log(`message:该函数发生错误,method:'${key}',error:'${err}'`);
}
};
}
});
a.method1(111,222);
a.method2();
可以用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的,看
app.get('/index', async function (req, res) {
try {
//业务逻辑
await do something
} catch (err) {
res.send(e.message)
}
});
我意思是后端报错了,但是前端一直是请求状态,所以catch的时候,我手动res.send错误信息给浏览器了,不然前端那边一直没反应
@realcrazysun npm搜索到了一个express-async-errors , 已经解决,谢谢。你这个没搜到…