Node.js – 获取客户端IP时request.client._peername.address的问题

我正在寻找使用http模块进行连接时获取客户端IP地址的方法。 我发现有两种方法可以做到这一点,可能会有更多:

  1. request.connection.remoteAddress
  2. request.client._peername.address

(1)似乎工作正常,但使用(2)时我看到一些奇怪的行为。 看看下面的例子:

var http = require('http'); var server = http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); var clientIP1 = request.connection.remoteAddress; var clientIP2 = request.client._peername.address; response.write("You are (1): " + clientIP1 + "\n" + "You are (2): " + clientIP2 + "\n"); response.end(); }).listen(8080); 

上面的代码工作得很好。 现在让我们对它进行一些更改。

 var server = http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); // Just removed (1). var clientIP2 = request.client._peername.address; response.write("You are (2): " + clientIP2 + "\n"); response.end(); }).listen(8080); 

以上不起作用。 这有多奇怪? 它给出了以下错误:

 var clientIP2 = request.client._peername.address; TypeError: Cannot read property 'address' of undefined 

进一步变化:

 var server = http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); var trash = request.client._peername.address; var clientIP2 = request.client._peername.address; var clientIP1 = request.connection.remoteAddress; response.write("You are (1): " + clientIP1 + "\n" + "You are (2): " + clientIP2 + "\n"); response.end(); }).listen(8080); 

上面的工作。

所以看起来顺序很重要 – 在request.connection.remoteAddress被执行之前,request.client._peername没有被实例化。 事实上,如果您事先没有使用(1),则不能使用(2)。

这不是一个大问题,但有人可以解释这里的内部工作吗?