gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:10:48 25 4
gpt4 key购买 nike

我正在使用 node.js 和 socket.io 来让我的网页访问由 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)

...整个过程结束。

我已经做了很多寻找解决方案的方法;大多数点击似乎来自程序员询问为什么首先收到 ECONNREFUSED - 并且建议只是确保 TCP 服务器可用。不讨论处理失败的情况。

这篇文章 - Node.js connectListener still called on socket error - 建议为“错误”事件添加一个处理程序,就像我在上面的代码中所做的那样。这正是我希望它工作的方式......除了它没有(对我而言),我的程序不会捕获 ECONNREFUSED。

我尝试过 RTFM,以及 http://nodejs.org/api/net.html#net_event_error_1 上的 node.js 文档表明确实存在“错误”事件 - 但几乎不知道如何使用它。

对其他类似 SO 帖子(例如 Node.js Error: connect ECONNREFUSED )的回答建议使用全局未捕获异常处理程序,但这对我来说似乎是一个糟糕的解决方案。这不是我的程序由于代码错误而引发异常,它工作正常 - 它应该按设计处理外部故障。

所以

  • 我是否以正确的方式处理这个问题? (很高兴承认这是一个新手错误)
  • 是否可以做我想做的事,如果可以,怎么做?

哦,还有:

$ 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' }

这证明错误得到了很好的处理......表明错误发生在其他地方。

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

webSocket.emit('error', error);

“错误”事件很特殊,需要在某处处理(如果不是,则流程结束)。

只需将事件重命名为“问题”或“警告”,整个错误对象就会通过 socket.io 套接字传输回网页:

webSocket.emit('warning', error);

关于node.js - 处理 TCP 套接字错误 ECONNREFUSED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25846475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com