Node.js服务器端连接到Socket.io

时间:2013-10-09 05:38:34

标签: node.js express socket.io

我有一个带有前端应用程序和后端应用程序的Node.js应用程序,后端将管理列表并“推送”更新到前端应用程序,对前端应用程序的调用将触发列表更新,以便所有客户收到正确的列表数据。

问题出现在后端,当我按下按钮时,我执行一个AJAX调用,并且AJAX调用将执行以下代码(修剪掉一些操作):

  Lists.findOne({_id: active_settings.active_id}, function(error, lists_result) {
      var song_list = new Array();
      for (i=0; i < lists_result.songs.length; i++) {
        song_list.push(lists_result.songs[i].ref);
      }
      Song.find({
        '_id': {$in: song_list}
      }, function(error, songs){
        // DO STUFF WITH THE SONGS
        // UPDATE SETTINGS (code trimmed)
        active_settings.save(function(error, updated_settings) {
            list = {
              settings: updated_settings,
            };
            var io = require('socket.io-client');
            var socket = io.connect(config.app_url);
            socket.on('connect', function () {
               socket.emit('update_list', {key: config.socket_key});
            });
            response.json({
                status: true,
                list: list
            });
            response.end();
          }
      });
    });

然而,响应。似乎永远不会工作,调用一直挂起,此外,列表并不总是刷新,因此socket.emit代码存在问题。并且套接字连接保持打开我假设因为响应没有结束?

我之前从未做过这个服务器端,所以任何帮助都会非常感激。 (active_settings等存在)

1 个答案:

答案 0 :(得分:2)

我发现可能会或可能不会导致您出现问题的一些问题:

  • list的范围不正确,因为您没有为var添加前缀;实质上,你正在创建一个全局变量,当有多个请求被处理时,它可能会被覆盖;
  • response.json()调用.end()本身;自己再次致电response.end()并没有什么害处,但没有必要;
  • 因为您没有在任何地方关闭套接字(.io)连接,所以它可能始终保持打开状态;
  • 听起来更合适的做法是不为每个请求设置新的socket.io连接,只需在您的应用启动时启用一次,然后重新使用;