我有几个节点tcp客户端和一个连接到外部服务器的tls客户端:
var socket = net.connect(args.connect.ip_port, args.connect.host);
socket.setTimeout(this.timeout);
socket.on('connect', this.socketOnConnect.bind(this));
socket.on('error', this.socketOnError.bind(this));
socket.on('timeout', this.socketOnTimeout.bind(this));
或
this.clearStream = tls.connect(
args.connect.ip_port,
args.connect.url,
{},
this.onSecureConnect.bind(this)
);
this.clearStream.on('error', this.clearStreamOnError.bind(this));
this.clearStream.on('end', this.clearStreamOnEnd.bind(this));
这两台服务器间歇性地发出未处理的错误:
(err): events.js:72
(err): throw er; // Unhandled 'error' event
(err): ^
(err): Error: read ECONNRESET
(err): at errnoException (net.js:904:11)
(err): at TCP.onread (net.js:558:19)
(err): events.js:72
(err): throw er; // Unhandled 'error' event
(err): ^
(err): Error: read ECONNRESET
(err): at errnoException (net.js:904:11)
(err): at TCP.onread (net.js:558:19)
我认为on('错误处理程序应该处理这些错误,但显然不是。我错过了什么?
我想我可以使用一个域来包装连接调用,但在我这样做之前我宁愿了解发生了什么。
答案 0 :(得分:0)
我还没有发现为什么这些错误正在偷偷摸摸('错误处理程序,但我已经过去了,并且在域错误处理程序中使用回溯在域中包含了可疑函数,至少使问题易于管理。
以下示例代码可供其他可能感兴趣的人使用。
var self = this;
var domain1 = domain.create();
domain1.on('error', function (err) {
log.error(util.format('Domain error in tls client: %s. Exiting.', err.message));
log.error(traceback.replace(/(?:\r\n|\r|\n)/g, '<br />'));
self.cleanExit();
});
domain1.run(function () {
self.clearStream = tls.connect(
args.connect.ip_port,
args.connect.url,
{},
self.onSecureConnect.bind(self)
);
});