Node.js – Socket.io:socket.request未定义

我已经在这里读到,我可以用node.js获取客户端的IP

socket.request.connection.remoteAddress

例如:

 var socket = io.listen(server); socket.on('connection', function(client){ var client_ip_address = socket.request.connection.remoteAddress; } 

但是当我使用这个解决scheme时,我得到错误消息“无法读取属性”未定义的连接“,这意味着socket.request是未定义的。

为什么会这样呢?

我也尝试了在同一页面上find的另一个选项:

 var sHeaders = socket.handshake.headers; console.info('[%s:%s] CONNECT', sHeaders['x-forwarded-for'], sHeaders['x-forwarded-port']); 

但是这只是输出

 [undefined:undefined] CONNECT 

我只是在我的电脑上试过这样的东西,它返回了127.0.0.1,这是正确的:

 var express = require('express'); var io = require('socket.io'); var path = require('path'); var app = express(); var server = http.createServer(app); var ioServer = io.listen(server); ioServer.sockets.on('connection', function (socket) { console.log(socket.request.connection.remoteAddress); // This gave 127.0.0.1 }); 

代码中的套接字不是客户端套接字连接,而是“服务器”本身,所以它没有request属性是正常的。 使用我写的代码或尝试更改:

 socket.on( 

至:

 socket.sockets.on( 

和:

 socket.request.connection.remoteAddress 

到(对于Express v4.x,Socket.IO v1.x):

 client.request.connection.remoteAddress 

或者(对于Express v3.x,Socket.IO v0.x) (这显然返回服务器IP):

 socket.handshake.address 

它应该给你你需要的东西。

编辑:如果我没有记错socket.io版本<1.x不使用client.request而是client.handshake所以尝试一个。

要升级express和socket.io,请检查这两个链接:

 var server = require('http').Server(app); var io = socketIO(server); io.on('connection', function(socket) { console.log('client IP: ',socket.handshake.address); // this should work too console.log('client IP: ',socket.client.conn.remoteAddress); // or console.log('client IP: ',socket.conn.remoteAddress); }); server.listen(3000); 

我刚刚读到,你正在使用heroku ..那么有道理,你会得到一个不同的IP地址,通常Herokunetworkingstream量是通过代理..因为,你wouldnt能够得到remoteAddress ..

在socketio.js中,只需更新:

  console.info('[%s] DISCONNECTED', socket.address); 

至:

  console.info('[%s] DISCONNECTED', socket.handshake.address); 

相同的日志连接。