2013-10-09 237 views
1

我有一个Node.js应用程序与一个前端应用程序和后端应用程序,后端将管理列表和“推”更新到前端应用程序,调用前端应用程序将触发列表更新,以便所有客户端都能收到正确的列表数据。Node.js服务器端连接到Socket.io

的问题是在后端侧,当我按下按钮,我执行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(); 
      } 
     }); 
    }); 

然而response.end似乎永远不会工作,通话不断,更进一步,列表并不总是刷新,所以有一个与socket.emit代码的问题。并且套接字连接保持打开我假设因为响应没有结束?

我从来没有做过这个服务器端之前,所以任何帮助将不胜感激。 (该active_settings等存在)

回答

2

我看到一些问题,可能会或可能不会引起你的问题:

  • list不正常范围的,因为你不var前缀它;基本上,你正在创建一个全局变量,当有多个请求被处理时,它可能会被覆盖;
  • response.json()来电.end()本身;自己再次致电response.end()并没有什么坏处,但并非必要;
  • 由于您没有关闭任何地方的套接字(.io)连接,它可能会始终保持打开状态;
  • 听起来更适合于不为每个请求设置新的socket.io连接,而只是在您的应用程序启动时重新使用该连接;
+0

如何关闭该连接?该呼叫将只发生一次,每4-5分钟一次,只有一个人执行,因此新连接没问题我认为 – romenov

+1

@romenov在发出消息(在连接处理程序中)尝试'socket.disconnect()' – robertklep

+0

我现在将其修改为: socket.on('connect',function(){ console.log('connected'); socket.emit('update_list',{key:config.socket_key}); socket .disconnect(); }); ('disconnect',function(){ console.log('disconnected'); response.end(); }); response.end(); 当我执行第一次控制台输出:连接,断开连接,但response.end()仍然不工作(列表的var范围也已被修复)当我再次按下时(即使在刷新之后),它没有给出连接/断开连接的消息了。而我的电话继续执行,2分钟后它得到一个200 OK – romenov

相关问题