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

每次客户端连接到我的nodejs服务器,我的服务器崩溃的错误“RangeError:最大调用堆栈大小超过”。 我相信我必须在某个地方有一个recursion的问题,但是它正在逃避我。

我的服务器:

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'); }); 

然后处理客户端的套接字:

 var users = []; $('#chatInput').submit(function(){ socket.emit('chat message', $('#m').val()); $('#m').val(''); return false; }); $('#nameInput').submit(function(){ socket.emit('set_name', $('#n').val()); $('#n').val(''); return false; }); socket.on('client list', function(msg){ $('#messages').append($('<li>').text('Processing client list...')); var i = 0; for(i=0;i<msg.length;i++){ $('#messages').append($('<li>').text('Client ' + i + ': ' + msg[i].address + ':' + msg[i].port + ', Name: ' + msg[i].name)); } }); socket.on('chat message', function(msg){ $('#messages').append($('<li>').text(msg)); }); socket.on('user disconnect', function(msg){ users[msg].unset(); }); socket.on('new user', function(msg){ users[msg] = []; users[msg].xPos = 0; users[msg].yPos = 0; $('#messages').append($('<li>').text(msg)); }); 

感谢您的回复。

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

 socket.emit('client list', allClients); 

当一个新用户连接时,我将整个连接对象推入“allClients”数组中。 包含在连接对象中的数据量太大,无法通过socket.emit发送,导致RangeError。

我将不得不简化客户端列表数据被发送到每个新的客户端,以避免这个…“堆栈溢出”.. 🙂

而不是你的循环,你可以使用这个(这将是相同的结果):

 socket.broadcast.emit('new user', socket.address + '_' + socket.port); 

那么你可以删除这部分:

 socket = null; var i = allClients.indexOf(socket); allClients.splice(i, 1); 

但是我不确定这是什么问题。 我猜你的socket.name = msg; 。 我不确定你能否更新这个对象。 最好删除这个。

 // 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); } 

上面的代码示例看起来有点怀疑我。 你检查了allClients.length的值吗? 作为一个旁注,为什么初始化我的值两次?variables