关于node_redis的错误处理问题,监听error事件不起效,并由此引申出一些异常处理的问题。
发布于 10 年前 作者 Stevenhuangqian 7661 次浏览 最后一次编辑是 8 年前

项目用的express+node_redis。。

var redis_client = redis.createClient(redis_port, redis_ip ); //catch error event create by redis connection redis_client.on(“error”, function (err) { console.log("Error: "+err.stack); });

这里已经监听了error事件。然后启动项目。redis的连接建立。这时候我把redis_server的进程kill掉。异常依然抛出,然后程序退出。。

events.js:72 throw er; // Unhandled ‘error’ event ^ Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED at RedisClient.on_error (/opt/N-chat/node_modules/redis/index.js:185:24) at Socket.stream.on.self.should_buffer (/opt/N-chat/node_modules/redis/index.js:95:14) at Socket.EventEmitter.emit (events.js:95:17) at Socket._destroy.self._writableState.errorEmitted (net.js:440:14) at process._tickCallback (node.js:419:13) Process finished with exit code 8 按照我的设想。。这个监听不是应该类似try catch里面的catch作用??如果我理解有误,请问怎么处理这种异常。。

PS: 网上查过翻过不少github上的项目,但是大部分项目都感觉是自己研究的性质。基本没看到完整的异常容错处理。 因为自己初学不久,所以我想是不是我错过了什么大家 默认的常识之类。下面再提一点小问题验证下: 官网的一个例子: app.param(‘user’, function(req, res, next, id){ User.find(id, function(err, user){ if (err) { next(err); } else if (user) { req.user = user; next(); } else { next(new Error(‘failed to load user’)); } }); }); next是一个函数,那就是说在所有的方法里面我都可以把它当作一个参数传递进去,然后next()作用相当于显式调用事件队列里面的下一个事件,并且把err传递到下一个事件,如果是这样理解怎么确定下一个就是异常处理的事件? 然后就是err,这个参数怎么理解。。如果这是单纯的js中的error对象(我断点看过这个对象的结构,是跟error对象应该是一样的。)。不明白的是整个error机制。是不是默认所有回调的第一个参数都是err??如果是的话,这个err能等效于try catch中的catch(err)这个动作吗?意思就是只要显式在function的参数声明这个参数就可以不用再捕捉回调函数体内的异常了?

可能问题不一定是node的问题,有可能是js的问题。。由于我自己也是js基础较差,只能尽量描述清楚我的问题~~先感谢你把这么长的问题看完。。希望能得到大家的指点~~

6 回复

在线等解答。。如果是问题提的不好的地方大家可以指出。我再尝试修改一下啊~~

redis那里的问题得去看redis这个库的代码是怎么回事。

你说的这个我已经看过。。有个不明白的地方。就是domain跟socket.io怎么结合。。是在domain的.run里面再执行socket.io的create事件,然后开始通信等等,还是说先执行socket.on()监听,在回调function里面嵌入domain.run??

此文章已经看过。收获很大~!之前一直用的三个参数怪不得不起效。。目前异常处理这块还差一个。。就是socket.io的。。我发现他监听的error事件只是对于socket连接本身的异常监听。。类似socket.on(‘event’,function(){…})这个函数里面的异常是无法监听的。。我想请问下如果我想做个全局的处理。专门处理这个socket的回调函数里面的异常可以怎么做?

回到顶部