在Node.js中,http.Server和https.Server都发出clientError事件但具有不同的参数:
http.Server#clientError(异常,套接字)
https.Server#clientError(exception,securePair)
securePair是tls.SecurePair的实例,securePair.cleartext是tls.CleartextStream,securePair.encrypted是tls.CryptoStream.
问题是:如何获取导致clientError的客户端的地址和端口?理论上,这应该工作:
socket = securePair.cleartext.socket;
console.log(socket.remoteAddress’:’socket.remotePort);
实际上,当我尝试使用HTTP连接到HTTPS服务器(假装它是一个HTTP服务器)并在几秒钟后取消时,我得到一个类型为ECONNRESET的clientError,但是socket.remoteAddress和socket.remotePort都是未定义的(甚至虽然securePair.cleartext.socket确实是一个net.Socket而且未定义).
最佳答案 不幸的是,赏金似乎没多大帮助:-(我不得不自己调查一下.
显然,已修复(但尚未在任何已发布的node.js中),即使在套接字关闭后也能获取这些值:https://github.com/joyent/node/commit/8c38b07252d86f4eef91344f8df4f0c3e38bca35
解决方法是在连接时存储地址:
srv.on('connect', function (socket) {
socket.stored_remoteAddress = socket.remoteAddress;
});
srv.on('clientError', function (err, socket) {
console.log(socket.cleartext.socket.stored_remoteAddress);
}
这有效,但并不漂亮.
显然,即使这不完全工作:-(
Node.js 0.11不会在SSL错误上发出’clientError’事件(例如),因此无法捕捉那里的情况.
Node.js 0.12发出’clientError’事件,但使用了一个新的TLS实现,它不再具有’cleartext’套接字.我找不到任何方法将信息从’connect’事件传递给’clientError’事件,或者找出它们是针对同一个套接字的任何方式(因为套接字已经在’clientError’事件中关闭).
所以,似乎唯一的方法是等待一个新的Node.js版本(最早的0.12.2,如果他们认为这值得修复)并希望这是真的修复.