Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 套接字IO:RangeError:超出最大调用堆栈大小_Javascript_Node.js_Sockets_Websocket - Fatal编程技术网

Javascript 套接字IO:RangeError:超出最大调用堆栈大小

Javascript 套接字IO:RangeError:超出最大调用堆栈大小,javascript,node.js,sockets,websocket,Javascript,Node.js,Sockets,Websocket,每次客户端连接到我的nodejs服务器时,我的服务器都会崩溃,并出现错误“RangeError:超出了最大调用堆栈大小”。我相信我一定在某个地方遇到了一个递归问题,但它一直在逃避我 我的服务器: require('monitor').start(); var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', f

每次客户端连接到我的nodejs服务器时,我的服务器都会崩溃,并出现错误“RangeError:超出了最大调用堆栈大小”。我相信我一定在某个地方遇到了一个递归问题,但它一直在逃避我

我的服务器:

require('monitor').start();
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});

var allClients = [];

io.on('connection', function(socket){
  console.log('user joined: ' + socket.request.connection.remoteAddress + ':' + socket.request.connection.remotePort);
  socket.address = socket.request.connection.remoteAddress;
  socket.port = socket.request.connection.remotePort;
  socket.name = '';
  socket.xPos = 0;
  socket.yPos = 0;
  //io.emit('new user', socket.address + '_' + socket.port);

  // Send current client list to new connection
  socket.emit('client list', allClients);

  // Only send 'new user' event to previously connected clients, not the new client.
  var i = 0;
  for(i=0;i<allClients.length;i++){
    allClients[i].emit('new user', socket.address + '_' + socket.port);
  }

  // Push new socket into the client array after the array has been sent to all other users
  allClients.push(socket);

  socket.on('chat message', function(msg){
    io.emit('chat message', socket.address + ':' + socket.port + ": " + socket.name + ' says: ' + msg);
    console.log(socket.address + ":" + socket.port + ": " + socket.name + ' says: ' + msg);
  });

    socket.on('set_name', function(msg){
    //io.emit('chat message', socket.address + ':' + socket.port + ': ' + msg);
    socket.name = msg;
    console.log(socket.address + ":" + socket.port + ' set name to: ' + msg);
  });

  socket.on('xPosUpdate', function(msg){
    //io.emit('chat message', socket.address + ':' + socket.port + ': ' + msg);
    console.log(socket.address + ":" + socket.port + ' set xPos to: ' + msg);
  });

  socket.on('yPosUpdate', function(msg){
    //io.emit('chat message', socket.address + ':' + socket.port + ': ' + msg);
    console.log(socket.address + ":" + socket.port + ' set yPos to: ' + msg);
  });

  socket.on('disconnect', function() {
    io.emit('user disconnect', socket.address + '_' + socket.port);
    io.emit('chat message', socket.address + ':' + socket.port + ": " + socket.name + ' disconnected.');
      console.log('Got disconnect!');
    socket = null;
      var i = allClients.indexOf(socket);
      allClients.splice(i, 1);
   });
});

http.listen(3000, function(){
  console.log('listening on *:3000');
});
require('monitor').start();
var app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
app.get('/',函数(req,res){
res.sendFile(uu dirname+'/index.html');
});
var-allClients=[];
io.on('连接',函数(套接字){
log('用户加入:'+socket.request.connection.remoteAddress+':'+socket.request.connection.remotePort);
socket.address=socket.request.connection.remoteAddress;
socket.port=socket.request.connection.remotePort;
socket.name='';
socket.xPos=0;
socket.yPos=0;
//io.emit('new user',socket.address+'.'+socket.port);
//将当前客户端列表发送到新连接
emit('client list',allClients);
//仅将“新用户”事件发送到以前连接的客户端,而不是新客户端。
var i=0;
对于(i=0;i
//仅将“新用户”事件发送到以前连接的客户端,而不是新客户端。
var i=0;

对于(i=0;i而不是您的循环,您可以使用此选项(结果相同):

然后,您可以删除此部件:

socket = null;
var i = allClients.indexOf(socket);
allClients.splice(i, 1);
但我不确定这是否是问题所在。
我在猜测您的
socket.name=msg;
。我不确定您是否能够更新此对象。最好删除此对象。

感谢您的回复

经过一段时间的实验,我意识到溢出错误是由于我试图在服务器上的以下行中发出大量数据而触发的:

socket.emit('client list', allClients);
当新用户连接时,我正在将整个连接对象推入“AllClient”数组中。连接对象中包含的数据量太大,无法通过套接字发送。emit并导致Range错误


我必须简化发送到每个新客户机的客户机列表数据,以避免出现这种情况……“堆栈溢出”。:)

我很确定它与您的
for
循环有关,但没有时间验证
socket.broadcast.emit('new user', socket.address + '_' + socket.port);
socket = null;
var i = allClients.indexOf(socket);
allClients.splice(i, 1);
socket.emit('client list', allClients);