在 Node.js 中 http.Server
和 https.Server
发出 clientError
事件但具有不同的参数:
http.Server#clientError(exception, socket)
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(假装它是 HTTP 服务器)连接到 HTTPS 服务器并在几秒钟后取消时,我得到一个 clientError
类型 ECONNRESET
,但是socket.remoteAddress
和 socket.remotePort
都是undefined
(即使 securePair.cleartext.socket
确实是 net.Socket
而不是 undefined
)。
最佳答案
不幸的是,赏金似乎没有多大帮助:-(我不得不自己调查。
显然,已经进行了修复(但尚未在任何已发布的 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,如果他们认为这值得修复)并希望它得到真正的修复。
关于node.js - 从 Node.js 中的 https.Server#clientError 获取 remoteAddress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25257709/