关于node_redis的错误处理问题,监听error事件不起效。
项目用的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上的项目,但是大部分项目都感觉是自己研究的性质。基本没看到完整的异常处理。如果大家有这种完整已经上线的项目,求链接学习下~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
@黄开源中国
你看了源码就会发现, createClient会去创建一个RedisClient 这个RedisClient类会直接去跟redis建立一个连接, 然后等待你的指令, 然而 在这个时候你没有办法监听error事件,因为监听error的这个动作是在Client对象中的, 此时还并没有返回Client对象, 等到后面返回Client对象的时候 错误已经发生了, 代码也没有执行到注册监听那里就直接crash了. 如果你一定要捕捉 可以监听process.on('uncaughtexception', func)
想跟你确认一下。createClient这一行不是在启动的时候执行吗?~我的意思是应用启用的时候是可以正常启动的。我是等应用启动完以后过一会才kill掉server端的进程。。
你这个问题直接看一下源码就知道了. 你的错误发生在createClient这一行. 而你的错误处理是在后面才注册的. 所以当然不会有任何反应.