node.js – 处理TCP套接字错误ECONNREFUSED

我使用socket.io的node.js让我的网页访问由TCP套接字提供的字符数据。 我对node.js很陌生

用户 —-> 网页 < – (socket.io) – > node.js < – (TCP) – > TCP服务器

代码是仁慈简洁的:

io.on('connection', function (webSocket) { tcpConnection = net.connect(5558, 'localhost', function() {}); tcpConnection.on('error', function(error) { webSocket.emit('error', error); tcpConnection.close(); }); tcpConnection.on('data', function(tcpData) { webSocket.emit('data', { data: String.fromCharCode.apply(null, new Uint8Array(tcpData))}); }); }); 

在正常情况下,这一切工作正常,但我不能保证TCP服务器会一直在那里。 当它不是,TCP堆栈返回ECONNREFUSED到node.js – 这是完全预期的,我需要处理它的优雅。 目前我看到:

 events.js:72 throw er; // Unhandled 'error' event ^ Error: connect ECONNREFUSED at errnoException (net.js:904:11) at Object.afterConnect [as oncomplete] (net.js:895:19) 

…整个过程结束

我已经做了大量的search解决scheme, 大多数命中似乎是从程序员问为什么ECONNREFUSED首先收到 – build议只是为了确保TCP服务器可用。 没有讨论处理失败案例。

这个后期Node.js connectListener仍然调用套接字错误 – build议添加一个处理程序的“错误”事件,我已经在上面的代码中完成。 这正是我想要的工作…除了(对我来说),我的程序不捕获ECONNREFUSED。

我尝试过使用RTFM,并且在http://nodejs.org/api/net.html#net_event_error_1上的node.js文档提示确实存在“错误”事件 – 但是不清楚如何使用它。

其他类似的SOpost(如Node.js错误:连接ECONNREFUSED )的答案build议一个全局未捕获的exception处理程序,但这似乎是一个糟糕的解决scheme给我。 这不是我的程序由于错误代码而抛出exception,它工作正常 – 应该是处理外部故障,因为它的devise。

所以

  • 我以正确的方式接近这个吗? (高兴地承认这是一个新手错误)
  • 有没有可能做我想做的事情,如果是的话,怎么样?

哦,还有:

 $ node -v v0.10.31 

我跑了下面的代码:

 var net = require('net'); var client = net.connect(5558, 'localhost', function() { console.log("bla"); }); client.on('error', function(ex) { console.log("handled error"); console.log(ex); }); 

由于我没有打开5558,输出是:

 $ node test.js handled error { [Error: connect ECONNREFUSED] code: 'ECONNREFUSED', errno: 'ECONNREFUSED', syscall: 'connect' } 

这certificate错误得到处理就好…暗示错误正在发生其他地方。

正如在另一个答案中所讨论的,问题实际上是这一行:

 webSocket.emit('error', error); 

“错误”事件是特殊的,需要在某个地方处理(如果不是,过程结束)。

简单地将事件重命名为“问题”或“警告”会导致整个错误对象通过socket.io套接字传回到网页:

 webSocket.emit('warning', error); 

好,有点尴尬,事实certificate,问题其实就是这一行:

 webSocket.emit('error', error); 

我的意图是:

  • 捕获TCP错误(如ECONNREFUSED)
  • 将它们通过socket.io套接字“重新抛出”到客户端网页
  • 在网页中以某种方式处理它们(尽pipe当然为了向用户显示某些返工/卫生处理)

然而,“错误”事件是特殊的,需要在某个地方处理(我没有这样做 – 因此过程结束了)。

简单地将事件重命名为“问题”会导致整个错误对象通过socket.io套接字传回到网页:

 webSocket.emit('problem', error);