Node.js + - Sockel.io Maximum call stack size exceeded
Für meine Knoten-Applikation, ich habe einen server (app.js) unter Debian sowohl für html-und websocket-Daten mithilfe von socket.io auf meinem client (index.html). Ich bin versucht, einen turn-basierte HTML5-multiplayer-Spiel.
Nach Durchführung einer Reihe von erfolgreichen Daten-übertragungen mit sockel.emit()/io.emit() und socket.auf(), mein server abstürzt, auf einem sockel.emit () - Aufruf mit dem Fehler
"Ereignisse.js:72
werfe er; //nicht Behandelte "Fehler" - Ereignis
RangeError: Maximum call stack size exceeded".
Ich habe schon ein paar sockel.on() event-Listener, mit jeweils mit einer anderen Funktion in das Spiel (z.B. roll_dice, end_turn, ready_to_play, etc.).
Habe ich versucht, die Erforschung des Problems (gefunden eine Menge Diskussion über async-Schleifen), aber nicht in der Lage war zu finden, wie die Lösungen zu meinem eigenen code. Ich legte relevante Quelle hier. Sie können auch alle anzeigen der Quelle auf meinem github unter: https://github.com/sjmoon0/gameofdeath
index.html
JS:
var socket = io.connect('http://131.178.15.173',{'forceNew':true});
...
//----------------Initialization and Menu functions-----------
socket.on('load', function (data) {
console.log(data);
clientID=data;
socket.emit('check_game_started', { un: clientID });
socket.on('last_client_loaded', function(hasStarted){
console.log("Has game started? :"+hasStarted);
if(hasStarted==true){
$('#choosecharacter').show();
}
});
});
socket.on('client_disconnect', function (data) {
console.log(data);
});
socket.on('client_counter', function (data) {
if(data<5){
console.log(data);
incrementLoadBar(data);
allowedInGame=true;
}
if(!allowedInGame){
...
}
});
socket.on('game_started', function (data) {
console.log(data);
$('#welcome').hide();
$('#choosecharacter').show();
});
socket.on('set_user', function(characterName){
chosenCharacter=characterName;
});
socket.on('disable_player_choice', function(data){
var id=data.stuff[0].chara;
incrementLoadBar(data.stuff[0].numChar);
console.log(id +" was chosen");
$('#'+id).hide();
});
//-------------------Gameplay functions
socket.on('start_gameplay',function(nonsense){
showChanges(nonsense);
$('#wait').hide();
$('#gamespace').show();
draw_c();
socket.emit('ready_to_play',chosenCharacter);
});
socket.on('take_turn',function(updatedBoard){
showChanges(updatedBoard);
if(updatedBoard.currPlayer==chosenCharacter){
promptUser(updatedBoard);
}
});
socket.on('roll_result',function(rollResult){
promptUser(rollResult);
});
...
$('#rollDiceButton').click(function(){
socket.emit('roll_dice',chosenCharacter);
});
$('#okCloseButton').click(function(){
socket.emit('end_turn',chosenCharacter);
});
$('.thumbnail').click(function(something){
socket.emit('player_chosen', something.target.id);
...
});
app.js
JS:
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
var url = require('url');
...
app.listen(8001);
function handler (req, res) {
...
}
console.log("~Server Running~");
io.on('connection', function (socket) {
console.log("A Client connected");
...
socket.emit('load', { user: uID });
io.emit('client_counter',numClients);
if(numClients==4){
gameStarted=true;
console.log("Game started!");
io.emit('game_started',"The Game has begun!");
}
else if(numClients>4){
numClients--;
delete allClients[allClients.indexOf(socket)];
}
socket.on('check_game_started', function (data) {
socket.emit('last_client_loaded', gameStarted);
console.log(data);
if(gameStarted){
console.log("Last Player Loaded!");
}
});
socket.on('player_chosen', function(cp){
...
socket.emit('set_user', cp);
...
io.emit('disable_player_choice',{'stuff':[{'chara':cp,'numChar':numCharChosen}]});
if(numCharChosen==4){
io.emit('start_gameplay', boardUpdate);
}
});
socket.on('disconnect',function(){
console.log("A client disconnected");
numClients--;
delete allClients[allClients.indexOf(socket)];
io.emit('client_disconnect',"We've lost another comrade!");
});
socket.on('ready_to_play',function(characterThatIsReadyToPlay){
io.emit('take_turn',boardUpdate);
});
socket.on('roll_dice', function(characterThatRolledDice){
var temp=generateRollResult(characterThatRolledDice)
socket.emit('roll_result',temp);
});
socket.on('end_turn',function(characterThatEndedTurn){
io.emit('take_turn',nextUpdate(characterThatEndedTurn));
});
});
Bitte sei sanft, ich habe gerade angefangen mit Node.js vor etwa einer Woche. Danke!
- Kannst du die vollständige Fehlermeldung ?
- Bearbeitet die Frage zu gehören, ist es: "Ereignisse.js:72 werfen-äh; //nicht Behandelte "Fehler" - Ereignis RangeError: Maximum call stack size exceeded".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gefunden zu meinem Problem.
Objekt (temp) habe ich versucht zu senden über das Netzwerk (in-Buchse.emit('roll_result',temp);) war ein self-referencing-array. Es war die rekursive Eigenschaft des Arrays, die den stack überschreitet die maximale Größe.
Die Antwort ist sehr hilfreich. Danke.
Ich hatte gerade das gleiche Problem und möchte mit jedem, der ihm begegnen.
Mein code verwendet express.js und hat die folgende:
Erzeugt es das "Maximum call stack überschritten" - Fehler. Das problem ist, dass ich, sollten Sie nicht senden Sie die variable 'res' über die socketio an den client. Ich denke, es wird dazu führen, dass einige rekursive Verhalten, wenn ich dies auch tun.
Die Lösung ist einfach, entfernen Sie die 'res', von der emit-Anweisung:
Dies ist die gleichen Fehler, die ich stieß, Wenn ich klickte auf "Absenden". Es war immer deaktiviert und werfen "Maximum call stack size exceeded". Ich mein browser neu gestartet, Es funktionierte.. Seltsames Verhalten
Ich würde gerne meine Fehler ein und demselben Thema:
im close-Ereignis, über die normale Funktion und das ( Ursache-Fehler ) Ursache eine Schleife in der Nähe event ausstrahlen und das Ergebnis ist stack size Fehler .
Mit den Pfeiltasten func. ( oder kopieren Sie echt in so etwas wie _diese und die Verwendung innerhalb der Funktion ) Problem.
Dies ist tatsächlich unwissend über Funktion, Kontext ( Rückruf ), oder Fahrlässigkeit ..
Ich hatte das gleiche Problem.
Für mich war das problem, dass das Objekt war ich emitting auf den sockel, statt einem Verweis auf die Buchse selbst. So war ich im Grunde senden a-Buchse im inneren eine Steckdose. Versuchen Sie nicht dieses zu Hause 🙂
Ich hatte das gleiche problem, es geschah, weil ich war senden 3 Objekte mit den Strahlen habe ich gelöst, indem es nur ein Objekt