我有问题从我的node.js应用程序传递数组到我的javascript客户端

时间:2013-04-01 14:45:53

标签: node.js

我在我的网站上有实时聊天,现在只是轮询。我希望与时俱进,并将其替换为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数组吗?我在这一点上有点难过,谷歌这次没帮我。非常感谢你们给予的任何帮助。

2 个答案:

答案 0 :(得分:2)

JavaScript有一个相当强烈的假设,Array使用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();
  // ...
}

答案 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的文档。这不是完全有用的,是吗?哦,好吧。我很自信。让我们更新,对吗?