2012-01-12 110 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。

如您所見,在您的示例中,您只需嘗試訪問尚未存在的屬性。 幾個毫秒太快;)

我希望現在很清楚。