令人困惑的JavaScript对象行为

时间:2012-01-12 22:46:41

标签: javascript node.js socket.io

我正在使用带有Node.js的Socket.IO。

我有一个对象socket,如下所示:

SocketNamespace
    $events: Object
    ...
    socket: Socket

那么如果我看Socket(即socket.socket

Socket
    $events: Object
    ...
    sessionid: "1549988601982716407"

再次,工作正常。

但是,如果我只想返回sessionid,那么我使用socket.socket.sessionid我得到...

undefined

如果我为typeof socket.socket object,我会socket.socket.sessionid,但对于undefined,我只会获得$(function() { $.getScript('http://localhost:8080/socket.io/socket.io.js', function() { var socket = io.connect('http://localhost:8080'); console.log(socket.socket.sessionid); }); });


修改:这是我的代码:

浏览器:

var io = require('socket.io').listen(8080);

io.sockets.on('connection', function (socket) {

});

应用:

console.log(typeof(socket));
console.log(typeof(socket.socket));
console.log(typeof(socket.socket.sessionid));

编辑2 :更多数据:

而不是一个日志,我已用此替换;

object
object
undefined

返回:

object
object
string

预期:

var x;
for (x in socket.socket)
{
    if (x == 'sessionid') {
        console.log(socket.socket[x]);
    }
}

编辑3:* 屏幕截图

Screenshot of console http://f.cl.ly/items/1p423t0q3F3G1D2Z470W/sockets.png


编辑4

奇怪的是,这很有效。

{{1}}

3 个答案:

答案 0 :(得分:1)

socket.socket.sessionid确实有效,并且在设置后包含会话ID。问题是它在您将其打印到控制台时没有设置,因为套接字尚未建立连接(因此没有会​​话ID)。

更改行

var socket = io.connect('http://localhost:8080');
console.log(socket.socket.sessionid);

var socket = io.connect('http://localhost:8080');
socket.on('connect', function () {
    console.log(socket.socket.sessionid);
});

一切都应该是金色的。

答案 1 :(得分:0)

我无法相信。

socket.socket['sessionid']

那很有用。谢谢大家。

答案 2 :(得分:0)

我将首先尝试解释为何出现错误。

TC正在关注Chrome开发者控制台,它正在显示一些数据。 但是

console.log(typeof(socket));

console.log(typeof(socket.socket.sessionid));

产生相同的输出。

如果您查看Chrome控制台,您会看到一个小小的" i"对象附近的符号。

这意味着,当您尝试访问sessionid时,它实际上并没有。 尝试例如开放财产。您将看到它显示与对象输出不同的内容。

但是当您在控制台中点击时,它会动态生成它。

如果您需要工作代码,它看起来像这样:

// SERVER. Place it where you first _receive_ a connection from a client.
socket.emit('connected'); 
// This will emit connected message. 
//It is a signal to your client, that there is an established CLIENT<->SERVER connetion

// CLIENT
socket.on('connected', function (){
console.log(socket.socket.sessionid);} // This produces correct sessionid

现在,这将在客户端生成有效的sessionid。

如您所见,在您的示例中,您只是尝试访问尚未存在的属性。 几毫秒太快;)

我希望现在很清楚。