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

时间:2011-07-13 10:20:29

标签: 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');

然而,在阅读0.4.9 docs on streams之后,我注意到在关闭事件中它说:

  

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

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

2 个答案:

答案 0 :(得分:7)

嗯,可以直接访问套接字:

req.socket.on('close', ...);

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

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!');
  });
});

修改 也许我应该提到,是的,技术上 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);
  });
});

答案 1 :(得分:2)

Socket.io

当你想知道一个套接字是否已关闭时,只有当你做一个挂起请求时才有意义(实时)我建议你使用socket.io来代替所有这些:< / p>

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  io.sockets.emit('this', { will: 'be received by everyone');

  socket.on('private message', function (from, msg) {
    console.log('I received a private message by ', from, ' saying ', msg);
  });

  socket.on('disconnect', function () {
    sockets.emit('user disconnected');
  });
});

关于socket.io的好处在于它是support by every browser(major)而你不必担心细节(这让你疯了)。他们用一个很好的API来抽象它。

Express

或使用Express时

var app = require('express').createServer();

app.get('/', function(req, res){
    req.on('close', function () {
        console.log('closed');
    });
});

app.listen(3000, '127.0.0.1');