var app = require(‘express’)(); var http = require(‘http’); var createDomain = require(‘domain’).create; var domain = createDomain(); app.use(function(req,res,next){ domain.add(req); domain.add(res); domain.run(function() { next(); }); domain.on(‘error’, function(e) { console.log(‘Error…’,e); //为毛这个function 就是不触发。。。。。。。。。。 }); }); app.get(’/service’,function(req,res){ //抛出一个Error throw new Error(‘congratulations’); res.send({‘test’:‘test’}); }); var MainServer = http.createServer(app).listen(8112);
问题是,这么一个简单的domain异常捕获代码,都无效。
https://nodejs.org/api/domain.html#domain_warning_don_t_ignore_errors
你的问题本身我无法回答,但domain模块已经不建议使用了,所以我觉得继续纠结这个问题是无意义的,希望我的回答能为你省下5块钱。
@coordcn 呵呵~ 谢谢,但是为了程序的健壮性考虑,还是希望能方案 全局 解决异步的异常处理问题,而不是靠代码逻辑本身去处理异常。
能预料到的,捕捉到根据情况返回客户端状态码就行。
不能预料到的,记录下来,让程序去死好了。不能预料的要么属于考虑不周(自己的错误),要么属于系统本身未知的bug(系统的错误),但是不管怎么样,都应该让程序去死,把问题暴露出来。
next可以传递error,自己去看文档吧,我本身并不赞成nodejs这种异步模式,尤其还是基于回调的,这种模式下,错误处理的确是头疼的,从根本上解决这个问题惟有用同步代码来写异步程序,这样每一步的错误都会清楚的表达出来,错误也不需要顺着回调链条依次传递。如果你认为nodejs还是可用的,koa这个过渡方案也可以考虑下,比express要好那么一点。
异步不是你所求,异步带来的性能好处才是你所求。真正明白这个道理的其实是没有多少人的,在保证性能的前提下,能用同步代码写异步程序才是王道,nodejs这种路子是没有前途的,即便generator/yield,async/await都不会改变本质上的东西。这个本质就是大家必须用异步思维去表达同步的业务逻辑。其实异步思维并没什么用,业务逻辑是同步的,写业务逻辑的要知道异步的细节有什么用呢?凭添烦恼,当然有的人是沾沾自喜的,以为掌握的什么秘密武器。。。
你的domain用的本来就不对。应该app是domain的中间件,而不是domain做app的中间件。domain被废就不说了
原来是你在群里问……红包呢哈哈