2013-10-09 5 views
1

У меня есть приложение Node.js с внешним интерфейсом и бэкэнд-приложением, бэкэнд будет управлять списком и «нажимать» обновление для внешнего приложения, вызов приложение frontend запускает обновление списка, чтобы все клиенты получали правильные данные списка.Соединение на стороне сервера 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 try 'socket.disconnect()' после того, как вы вышли из сообщения (в обработчике 'connect') – robertklep

+0

Я изменил его теперь на это: socket.on ('connect', function() { console.log ('connected'); socket.emit ('update_list', {key: config.socket_key}); socket .disconnect(); }); socket.on ('disconnect', function() { console.log ('disconnecting'); response.end(); }); response.end(); Когда я выполняю первые выходные выходы консоли: подключен, отключается, но response.end() все еще не работает (область видимости в списке также исправлена) Когда я снова нажимаю (даже после обновления и т. Д.), Это не дает связанное/отсоединяющее сообщение. И мой вызов продолжает выполняться, и через 2 минуты он получает 200 OK – romenov

Смежные вопросы