我在我的网站上有实时聊天,现在只是轮询。我希望与时俱进,并将其替换为node.js版本。我一直在取得良好进展,但我现在仍然坚持看似只是语法问题。
所以我正在做的是当用户第一次访问我的网站时,我想向他们展示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 :(得分:2)
JavaScript有一个相当强烈的假设,Array
使用0
和length-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();
// ...
}
答案 1 :(得分: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的文档。这不是完全有用的,是吗?哦,好吧。我很自信。让我们更新,对吗?