Node.js – 获取客户端IP时request.client._peername.address的问题
我正在寻找使用http模块进行连接时获取客户端IP地址的方法。 我发现有两种方法可以做到这一点,可能会有更多:
- request.connection.remoteAddress
- 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)。
这不是一个大问题,但有人可以解释这里的内部工作吗?