JeuWeb - Crée ton jeu par navigateur
[Node] Plantages aléatoires de l'application - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Node] Plantages aléatoires de l'application (/showthread.php?tid=6553)



[Node] Plantages aléatoires de l'application - infoclick - 27-01-2013

Hello !
Ca y est, je me décide enfin de poster ! Cela fait un petit moment que je vous lis, et je suis impressionné par la qualité des discutions au sujet de node.

J'utilise aussi la technologie pour un jeu et rencontre actuellement des plantages depuis la mise en production (béta). J'ai besoin à ce jour de vos lumières Smile

Grossièrement, je créer (côté serveur), un tableau qui contient mes joueurs ainsi que leurs informations :


socket.on('login', function(user){
joueurs[user.username] = user;
joueurs[user.username].dernierMessage = d.getTime();
....
}

Le problème qui se pose est que aléatoirement le serveur plante avec ce genre d'erreur :


if(joueurs[me.username].dernierMessage>parseInt(d.getTime())-1500) { bod
^
TypeError: Cannot read property 'dernierMessage' of undefined


Je pense alors à la piste suivante : le joueur est déconnecté et pourtant passe toujours dans un cas du type : socket.on('message', function(proposition){...}); . Le programme ne trouve alors plus la valeur de dernierMessage car il est passé par la déconnexion :


socket.on('disconnect', function(){
if (!me){return false;}
delete joueurs[me.username];
}

Es-ce une erreur connue? Quelle est la facon de contourner le problème? Merci par avance pour vos lumières !


RE: Expert nodejs - Sephi-Chan - 27-01-2013

Le serveur plante parce que la clé n'existe plus dans ton objet joueurs. Pour ne plus avoir d'erreur, il faudrait tester l'existence de l'objet avant de l'utiliser. Par exemple :


var player = joueurs[me.username];
var fewMinutesAgo = parseInt(d.getTime())-1500);

if (player && player.lastMessageAt > fewMinutesAgo) {
// Do something...
}

Après, reste à savoir si le cas où la variable player sera vide sont supposés arriver. Mais ça dépend de ton application.


N'hésite pas à te présenter à la communauté. On aime bien en savoir plus sur les personnes avec qui on discute. Smile
Dans la même veine, pense à utiliser le BBCode code=Javascript plutôt que code tout uniquement et choisis un titre adapté à ta question. Ceci dans l'intérêt de ceux qui vont t'aider (et indirectement, de toi).


RE: [Node] Plantages aléatoires de l'application - infoclick - 27-01-2013

Bien noté pour le titre du topic et le bbcode. Ok, le test de l'object player ou joueur avant son utilisation peut être une façon d'éviter le plantage.
Par contre, en creusant plus, je me suis rendu compte de qq chose dans le log, il est écrit cela :

if(joueurs[me.username].dernierMessage>parseInt(d.getTime())-1500) { bod
^
TypeError: Cannot read property 'dernierMessage' of undefined
at Request.io.sockets.on.socket.on.joueurSup [as _callback]


Je n'avais pas fait gaffe, c'est écrit : on.joueurSup, et ce fameux joueurSup, je l'utilise pour virer les joueurs non actifs :

				
joueursInactifs=body.split(';'); //je récupérer la liste des joueurs séparer d'un ;

for (var m in joueursInactifs)
{
joueurSup=joueursInactifs[m];
delete joueurs[joueurSup];
io.sockets.to(me.theme).emit('delJoueur', joueurSup);
}

Cette boucle est exécutée, au moment ou je déconnecte un joueur (jen profite pour faire le ménage à ce moment).
Cela serait donc lié ?

Merci.


RE: [Node] Plantages aléatoires de l'application - infoclick - 28-01-2013

Ok pour vous tenir informé, malgré mon dernier post, le script plante toujours.
Je viens donc d'ajouter le test préconisé par Sephi-Chan à savoir :


if (player && player.lastMessageAt > fewMinutesAgo)

Je vous tiens informé.


RE: [Node] Plantages aléatoires de l'application - infoclick - 29-01-2013

Hello les amis, aie plantage à nouveau aujourd'hui :


if(joueurs && joueurs[me.username].dernierMessage>parseInt(d.getTime())-
^
TypeError: Cannot read property 'dernierMessage' of undefined

C'est la meme erreur qu'auparavant, je me demande s'il ne serait pas plus judicieux de faire :
1. Déjà un test à savoir si joueurs est ok
2. Puis un test sur le dernier message soit du genre :




if(joueurs)
{
if (joueurs[me.username].dernierMessage>parseInt(d.getTime())) ....
{...}
}


Quand pensez vous ?


RE: [Node] Plantages aléatoires de l'application - Sephi-Chan - 29-01-2013

J'en penses que tu n'as pas compris l'intérêt du test. Smile

Le test à faire, c'est :


if(joueurs[me.username] && joueurs[me.username].dernierMessage>parseInt(d.getTime())


Par ailleurs, tu devrais vraiment développement en anglais et utiliser des variables intermédiaires : tu y gagnerais en clarté (cf. le code de ma première réponse).