2013-10-09 277 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

相關問題