Node.js + Socket.io Maximale de la pile d'appels de taille dépassait
Pour mon Nœud de l'application, j'ai un serveur (app.js tourne sur Debian servant à la fois html et websocket des données à l'aide d'une douille.io pour mes clients index.html). Je cherche à faire un tour à base de HTML5 jeu multijoueur.
Après l'exécution d'un certain nombre de transmissions de données à l'aide d'une douille.emit()/io.emit() et de la prise.sur(), mon serveur se bloque sur une socket.emit() avec l'erreur
"les événements.js:72
jeter er; //non Gérée "erreur" de l'événement
RangeError: le Maximum de la pile d'appels de taille dépassé".
J'ai assez peu de prise.sur les() des écouteurs d'événement, avec chacun manipulant une fonction différente dans le jeu (par exemple roll_dice, end_turn, ready_to_play, etc.).
J'ai tenté des recherches sur le problème (trouvé beaucoup de discussion sur async boucles), mais a été incapable de trouver la façon d'appliquer les solutions à mon propre code. J'ai attaché source pertinente ici. Vous pouvez également afficher toutes les sources sur mon github à: 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));
});
});
Soyez doux, j'ai juste commencé à l'aide de Node.js il ya une semaine. Merci!
- Pouvez-vous poster le message d'erreur complet ?
- Édité question de l'inclure, c'est: "des événements.js:72 jeter er; //non Gérée "erreur" de l'événement RangeError: le Maximum de la pile d'appels de taille dépassé".
Vous devez vous connecter pour publier un commentaire.
Trouvé mon problème.
L'objet (temp) j'ai tenté de l'envoyer sur le réseau (socket.emit('roll_result',temp);) est un auto-référencement tableau. Il était la propriété récursive de la matrice qui a causé la pile à dépasser la taille maximale.
La réponse est très utile. Merci.
J'ai juste eu le même problème et que vous souhaitez partager avec une personne qui pourrait le rencontrer.
Mon code utilise express.js et a ce qui suit:
Il a généré le "Maximum de la pile des appels de dépassement d'erreur". Le problème est que je ne devrais pas envoyer la variable 'res' au cours de la socketio pour le client. Je suppose que cela va causer quelques récursive comportement si je le fais.
La solution est simplement de supprimer la " res " de l'émettent de la déclaration:
C'est la même erreur que j'ai trouvé, Quand j'ai cliqué sur le bouton soumettre. Il était désactivé et lancer "taille de la pile d'appel Maximal dépassé". J'ai redémarré mon navigateur, Il a travaillé.. Étrange comportement
Je voudrais partager mon erreur sur la même question:
à proximité de l'événement, à l'aide de la fonction normale et ce ( cause de l'erreur ) causer une boucle de près l'événement émettent et le résultat est la taille de la pile d'erreur .
L'aide des touches flèche touche func. ( ou la copie de cette dans quelque chose comme _ce et l'aide à l'intérieur de la fonction ) résolution du problème.
C'est en fait d'être ignorants au sujet de la fonction du contexte ( en rappel ), ou de négligence ..
J'ai eu le même problème.
Pour moi le problème était que l'objet que j'était en émettant sur le socket a tenu une référence à la douille elle-même. Donc, j'ai fait de l'envoi d'une prise à l'intérieur d'une douille. Ne pas essayer à la maison 🙂
J'ai eu le même problème, c'est arrivé parce que j'ai été l'envoi de 3 objets avec le émettent je l'ai résolu par l'envoi d'un seul objet