0

我在我的网站上有实时聊天,现在只是投票。我想与时俱进,并将其替换为 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 数组吗?在这一点上我有点难过,这次谷歌没有帮助我。你们可以提供的任何帮助将不胜感激。

4

2 回答 2

2

JavaScript 有一个相当强的假设,即s 使用和Array之间的数字键。虽然它们仍然可以有其他键,但大多数处理s 的函数都会忽略它们——包括Socket.IO 使用的那些。0length-1ArrayJSON.stringify()

因此,如果您需要设置其他键并且不希望它们被跳过,您将需要使用普通键Object

var user_info = new Array();
for (var i = 0; i < rows.length; i++) {
  user_info[i] = new Object();
  // ...
}
于 2013-04-01T16:04:16.600 回答
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 似乎没有文档。这并不完全有帮助,是吗?哦,好吧。我很自信。让我们更新,对吧?

于 2013-04-01T15:08:48.933 回答