2013-04-01 56 views
0

我在我的網站上進行實時聊天,現在只是輪詢。我希望與時俱進,並用node.js版本替換它。我一直在取得很好的進展,但現在我停留在看起來只是語法問題的東西上。我有問題從我的node.js應用程序傳遞數組到我的javascript客戶端

所以我在做什麼時,當用戶第一次來到我的網站,我想向他們展示在mysql數據庫中最近的聊天。因此,這將是

時間用戶他們的信息

我送的用戶將數據從我app.js連接與

io.sockets.on('connection', function (socket) { 
//Make connection to mysql 
connection.query('select values from my_table limit 5', function(err, rows, fields) { 
user_info = new Array(); 
for (i = 0; i < rows.length; i++) { 
    user_info[i] = new Array(); 
    user_info[i]['time'] = rows[i].time; 
    user_info[i]['user'] = rows[i].user; 
    user_info[i]['their_message'] = rows[i].their_message; 
} 
io.sockets.emit('some_event_tag', user_info); 
}); 

所以此工程文件,只是當我嘗試的行並在與「some_event_tag」相關的功能下訪問這些數據,則顯示我的語法已關閉,因爲我沒有收到這些信息。所以在客戶端,我試圖訪問數據與

some_event_tag: function(data) { 
    var msg = ''; 
    for (i = 0; i < data.length; i++) { 
    msg = $('<div class="msg"></div>') 
     .append('<span class="name">' + data[i]['user'] + '</span>: ') 
     .append('<span class="text">' + data[i]['their_message'] + '</span>'); 
     $('#messages') 
     .append(msg); 
    msg = ''; 
    } 
}, 

但無論出於什麼原因,我得到「未定義」。在服務器端,如果我改變

io.sockets.emit('some_event_tag', user_info); 

喜歡的東西

io.sockets.emit('some_event_tag', user_info[0]['user']); 

我可以(通過只是說「數據」)來訪問客戶端上的此值。當然,在這種情況下,我只傳遞一個值。不是我想要的。在客戶端,我也可以正確地看到正在傳遞五個數組元素。換句話說,data.length正確設置爲5.但是,我實際上無法找出訪問客戶端數據的語法。這不僅僅是典型的JavaScript數組嗎?這一點我有點難以理解,谷歌這次沒有幫助我。任何幫助你們可以給予不勝感激。

回答

0

我懷疑產生SSCCE將突出您的問題,其中包括:

// The time is the user and the user is the time? ;) 
user_info[i]['time'] = rows[i].user; 
user_info[i]['user'] = rows[i].time; 

如果rows[i].time東西日期樣,然後user_info[i]['user']很可能是一些日期樣。產生了一個問題,是否或不io.sockets.emit可以發出日期樣東西:

io.sockets.emit('some_event_tag', user_info[0]['user']); 

有似乎是io.sockets.emit的文檔。這不完全有用,是嗎?哦,好吧。我很自信。讓我們更新,對吧?

+0

哎呦。好的,我做了更正。不,時間應該是時間,用戶應該是用戶!你提出一個關於發射可以發送的好消息。它可能只能發送字符串,這就是爲什麼我能夠看到個別值而不是在發送數組時。如果是這樣的話,我想我可以發送一個json字符串並使用它。讓我看看我能做些什麼。 – bigyellow

+0

可修改,它看起來你的意見把我送到了正確的道路。顯然你不能傳遞數組與發射?讓我們這樣說吧,如果可以的話,我不知道該怎麼做。所以我所做的就是傳遞一個json字符串,然後在客戶端對它進行評估並用data [i] .value訪問它。你可以用JSON.parse(data)將json字符串轉換爲一個對象,但不是所有的瀏覽器都可以運行該代碼行,而是需要包含外部的json解析來處理這些情況。至少我有一個解決方案。謝謝。 – bigyellow

+0

@ user2232419我很高興能幫上忙。此外,我可以很快看到這些信息對我有幫助。謝謝! – Sebivor

2

JavaScript有一個相當強烈的假設,Array s使用0length-1之間的數字鍵。雖然他們仍然可以使用其他密鑰,但大多數處理Array的函數都會忽略它們,包括Socket.IO使用的JSON.stringify()

因此,如果您需要設置其他鍵,不希望他們跳過,你要使用普通Object代替:

var user_info = new Array(); 
for (var i = 0; i < rows.length; i++) { 
    user_info[i] = new Object(); 
    // ... 
} 
相關問題