监视传入HTTP请求的连接终止 - Node.JS

Bai*_*ker 2 javascript http node.js

在Node.JS中向另一个HTTP服务器发出请求时,您可以侦听服务器何时关闭连接request.on('close', function(){});.我一直在寻找Node的类似功能http.createServer().我假设传递给回调的请求变量有一个on()函数,当客户端关闭连接时我可以调用该函数来监听.

var http = require('http');
http.createServer(function(req, res) {
    req.on('close', function() { console.log("Connection closed"); });
}).listen(80, '127.0.0.1');
Run Code Online (Sandbox Code Playgroud)

但是,在阅读了关于溪流0.4.9文档后,我注意到在关闭事件中它说:

并非所有流都会发出此信号.(例如,传入的HTTP请求不会发出'close'.)

有没有办法从Node中的服务器侦听客户端连接终止?

chj*_*hjj 7

好吧,您可以通过执行以下操作直接访问套接字:

req.socket.on('close', ...);
Run Code Online (Sandbox Code Playgroud)

但是,在请求侦听器中执行此操作将为每个请求绑定事件.所以你应该绑定到连接事件:

var server = http.createServer();
server.on('request', function(req, res) { ... });
server.on('connection', function(socket) {
  socket.on('close', function() {
    console.log(socket.remoteAddress + '\'s keep-alive session died!');
  });
});
Run Code Online (Sandbox Code Playgroud)

编辑: 也许我应该提到,是的,从技术上讲,http服务器的套接字对象将带有对_httpMessage属性响应的引用.但是,我建议不要使用它,因为它是内部API的一部分,并且可能会在没有任何警告的情况下进行更改.

最好添加自己的属性来获取对上一个请求的引用:

server.on('request', function(req, res) {
  req.socket.currentRequest = req;
});
server.on('connection', function(socket) {
  socket.on('close', function() {
    var req = socket.currentRequest;
    console.log('Socket closed. Last request for: ' + req.url);
  });
});
Run Code Online (Sandbox Code Playgroud)