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

Posted

技术标签:

【中文标题】Node.js - Socket.io:socket.request 未定义【英文标题】:Node.js - Socket.io : socket.request undefined 【发布时间】:2015-01-04 08:05:29 【问题描述】:

我已经阅读了here,我可以在 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;

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

为什么会这样?

我还尝试了在同一页面上找到的另一个选项:

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

但这只是输出

[undefined:undefined] CONNECT

【问题讨论】:

【参考方案1】:

我刚刚在我的电脑上尝试了类似的操作,它返回了正确的 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
);

您代码中的socket 不是客户端套接字连接,而是“服务器”本身,因此它没有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 版本 client.request 而是 client.handshake 所以试试那个。

要升级 express 和 socket.io,请查看以下两个链接:

https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x http://socket.io/docs/migrating-from-0-9/

【讨论】:

问题可能出在版本号上(您建议的更改并不能解决问题)。我目前正在运行 express 3.2.6 和 socketio 0.9.6。在不破坏所有内容的情况下应该工作的最低版本是什么?例如,我尝试更新到 socketio 1.2.0,但之后我无法运行我的应用程序TypeError: Object #<Server> has no method 'configure' 我已经尝试使用handshake,在本地它返回 127.0.0.1,这很好,但是当我在 heroku 上上传我的应用程序时,我每次连接到应用程序时都会得到不同的 IP,即使连接来自同一台机器。我还在这里看到***.com/a/24881422/1967110 handshake 实际上返回的是服务器的 IP 而不是客户端的 IP。 @SullivanOrlean 您是否尝试过输出整个socket.handshake.headers,因为该部分已经修复,并检查您要查找的 IP 是否在那里?如果没有,我相信你最好的选择是升级 Express 和 Socket.IO 并尝试socket.request【参考方案2】:
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 地址是有道理的,通常 heroku 中的网络流量通过代理.. 因此您将无法获得 remoteAddress..

【讨论】:

【参考方案3】:

在 socketio.js 中,只需更新:

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

到:

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

CONNECTED 日志也是如此。

【讨论】:

以上是关于Node.js - Socket.io:socket.request 未定义的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js 中构建 socket.io/express 应用程序时是不是需要 http?

Node.js的速度困境:AJAX 和 Socket.IO到底选哪个?

节点 js 错误:找不到模块 './lib/socket.io'

Socket.IO 入门

未找到 Socket.io.js(node.js + express + socket.io)

为 socket.io 和 SSL / WSS 配置 Apache