2012-01-12 109 views
1

我在Node.js中使用Socket.IO。混淆JavaScript对象行为

我有一个对象socket,看起来像这样:

SocketNamespace 
    $events: Object 
    ... 
    socket: Socket 

所以后来如果我看Socket(即socket.socket

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

再次,工作正常。

但如果我只是想回到sessionid,所以我用socket.socket.sessionid我得到...

undefined 

如果我对socket.socket我得到object做一个typeof,但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) { 

}); 

编辑2:更多的数据:

而不是一个日志,我已经取代了这个;

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

返回:

object 
object 
undefined 

预计:

object 
object 
string 

编辑3:*截图

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


编辑4

此,奇怪的是,工作。

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

***请不要引用伪代码。您的问题可能与您使用的实际代码*有关。如果您没有引用实际的代码,我们无法帮助您。 – 2012-01-12 22:51:45

+0

我已经添加了代码 - 但它只是标准的东西,没有看到需要用代码填充页面。 – 2012-01-12 23:20:47

+0

因此,在原始示例中,您引用'sessionid',但在您编辑的代码中引用'session_id'。这可能是问题吗?它应该是'sessionid'吗? – Treffynnon 2012-01-12 23:21:20

回答

0

我不能相信这一点。

socket.socket['sessionid'] 

工作。谢谢大家。

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); 
}); 

,一切都应该是金色的。

+0

可悲的是,还没有为我工作 - 仍然发送'未定义'。感谢您的意见,这确实有道理。 – 2012-01-23 21:53:15

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 

现在,这将产生一个客户端一个有效的会话ID。

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

我希望现在很清楚。