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);
相同的日志连接。