CNode

express异步异常的处理

问答
Vvlwq发布于9 年前最后回复8 年前9 回复6541 浏览0 收藏

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)

Z
zy445566#1·9 年前

我之前回答过类似问题,我就把我之前的答案搬运过来吧,其实可以用切面的方法来实现捕捉异常 我现在就是这样做的,说白了就是对每个方法都包装一层

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();

R
realcrazysun#2·9 年前

可以用express-router-async 这个库 虽然知道这个库的人不多

D
DavidLuman#3·8 年前

楼主解决了吗,我也遇到同样的问题了,每个路由写try-catch很烦

S
steambap#4·9 年前
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

S
sodawy#5·9 年前

中间件间调用,其实就是function数组通过next链式调用: fn1中调用nextnext就是fn2fn2进入调用栈...也会按照这个逻辑出调用栈 代码中出现了异常,如果在当前上下文中没有try-catch异常就会向调用栈中的上一层函数冒泡 理清执行顺序后,在合适的地方加入try-catch就会抓到你要的exception

所以你可以在app级路由前加一个中间件处理,也可以在路由级内加前置处理,都是有给你加切面机会的

ps: koa的中间件function只运行一次。

V
vlwq#7·9 年前
引用 sodawy中间件间调用,其实就是function数组通过next链式调用: fn1中调用next,next就是fn2,fn2进入调用栈...也会按照这个逻辑出调用栈 代码中出现了异常,如果在当前上下文中...

@soda-wy koa一次么....app级别前置中间件没用

比如: router.post('/list', userRequired, controller.list);

userRequired是拦截是否登录的中间件,改成 try { next() } catch(e){..........} 对下一步next(controller.list)的报错无法拦截

除非在这个路由文件,做个除了,包一一下controller.list

现在是后端拦截了,前端那边接口没反应,需要用到res

V
vlwq#8·9 年前
引用 zy445566我之前回答过类似问题,我就把我之前的答案搬运过来吧,其实可以用切面的方法来实现捕捉异常 我现在就是这样做的,说白了就是对每个方法都包装一层

@zy445566 后端是能catch到error的,看

app.get('/index', async function (req, res) {
  try {
    //业务逻辑
	await do something
  } catch (err) {
    res.send(e.message)
  }
});

我意思是后端报错了,但是前端一直是请求状态,所以catch的时候,我手动res.send错误信息给浏览器了,不然前端那边一直没反应

V
vlwq#9·9 年前
引用 realcrazysun可以用express router async 这个库 虽然知道这个库的人不多

@realcrazysun npm搜索到了一个express-async-errors , 已经解决,谢谢。你这个没搜到.........

参与回复
登录后即可参与回复。登录