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

Node.js服务器端到Socket.io的连接,node.js,express,socket.io,Node.js,Express,Socket.io,我有一个Node.js应用程序,其中有一个前端应用程序和一个后端应用程序,后端将管理列表并“推送”到前端应用程序的更新,对前端应用程序的调用将触发列表更新,以便所有客户端接收正确的列表数据 问题是在后端,当我按下按钮时,我执行一个AJAX调用,该AJAX调用将执行以下代码(从中删除一些操作): Lists.findOne({\u id:active\u settings.active\u id},函数(错误,Lists\u结果){ var song_list=新数组(); 对于(i=0;i

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

问题是在后端,当我按下按钮时,我执行一个AJAX调用,该AJAX调用将执行以下代码(从中删除一些操作):

Lists.findOne({\u id:active\u settings.active\u id},函数(错误,Lists\u结果){
var song_list=新数组();
对于(i=0;i
但是response.end似乎永远不起作用,调用一直挂起,而且列表并不总是刷新,因此socket.emit代码存在问题。我想socket连接保持打开状态是因为响应没有结束


我以前从未使用过此服务器端,因此非常感谢您的帮助。(活动的\u设置等存在)

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

  • list
    的作用域不正确,因为您没有在其前面加上
    var
    ;实际上,您正在创建一个全局变量,当处理多个请求时,该变量可能会被覆盖
  • response.json()
  • 由于您没有在任何地方关闭套接字(.io)连接,因此它可能始终保持打开状态
  • 听起来更合适的做法是不要为每个请求设置一个新的
    socket.io
    连接,而是在应用程序启动时只设置一次,然后重新使用

如何关闭该连接?呼叫只会每4-5分钟发生一次,并且只由一个人执行,因此新连接正常think@romenov发出消息后(在
connect
处理程序中),请尝试
socket.disconnect()
,我现在将其修改为: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();当我第一次执行控制台输出时:connected,disconnecting,但response.end()仍然不起作用(列表的var范围也已固定)当我再次按下时(即使在刷新等之后)它不再发送已连接/断开连接的消息。我的呼叫一直在执行,2分钟后它会收到200OK@romenov我认为您不应该在套接字的
disconnect
处理程序中结束响应;另外,请尝试删除socket.io部分,看看这是否解决了您的响应问题出于某种原因,response.json..我删除了它,只使用了response.end(),现在响应问题已经解决..但是套接字部分仍然是持久的
  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();
          }
      });
    });