Chr*_*ead 19 sockets tcp node.js
我正在使用带有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))});
});
});
Run Code Online (Sandbox Code Playgroud)
在正常情况下一切正常,但我不能保证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)
Run Code Online (Sandbox Code Playgroud)
......整个过程结束.
我已经做了很多寻找解决方案; 大多数点击似乎来自程序员,他们首先询问为什么会收到ECONNREFUSED - 建议只是为了确保TCP服务器可用.没有讨论处理失败案件.
这个帖子 - Node.js connectListener仍然调用socket错误 - 建议为'error'事件添加一个处理程序,就像我在上面的代码中所做的那样.这正是我希望它工作的方式......除了它(对我来说),我的程序不会陷入ECONNREFUSED.
我已经尝试过RTFM,而http://nodejs.org/api/net.html#net_event_error_1上的node.js文档表明确实存在"错误"事件 - 但很少提供如何使用它的线索.
其他类似SO帖子的答案(例如Node.js错误:连接ECONNREFUSED)建议一个全局未捕获的异常处理程序,但这对我来说似乎是一个糟糕的解决方案.这不是我的程序由于错误的代码而抛出异常,它工作正常 - 它应该处理外部故障,因为它的设计目的.
所以
哦,并且:
$ node -v
v0.10.31
Run Code Online (Sandbox Code Playgroud)
ala*_*rev 19
我运行了以下代码:
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);
});
Run Code Online (Sandbox Code Playgroud)
因为我没有5558打开,输出是:
$ node test.js
handled error
{ [Error: connect ECONNREFUSED]
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect' }
Run Code Online (Sandbox Code Playgroud)
这证明错误处理得很好......暗示错误发生在其他地方 - 在哪里.
正如另一个答案中所讨论的,问题实际上是这一行:
webSocket.emit('error', error);
Run Code Online (Sandbox Code Playgroud)
'error'事件很特殊,需要在某处处理(如果不是,则流程结束).
简单地将事件重命名为'problem'或'warning'会导致整个错误对象通过socket.io套接字传回到网页:
webSocket.emit('warning', error);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
25291 次 |
最近记录: |