express异步异常的处理
发布于 3 个月前 作者 vlwq 780 次浏览 来自 问答

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

8 回复
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中调用nextnext就是fn2fn2进入调用栈…也会按照这个逻辑出调用栈 代码中出现了异常,如果在当前上下文中没有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 , 已经解决,谢谢。你这个没搜到…

回到顶部