IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Fonction retourne undefined


Sujet :

NodeJS

  1. #1
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 412
    Points : 4 854
    Points
    4 854
    Par défaut Fonction retourne undefined
    bonsoir,
    j'utilise cette fonction pour récupérer les id des utilisateurs depuis la base de données Mysql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    getId=function(username){ 
    	connectionDatabase.query("select * from personne where nom=?",[username],function(erreur,lignes,fields){
    		if(!erreur){
    			for(i in lignes){
    				id=lignes[i].id_personne;
    				console.log("success :"+id);//ici les id sont bien récupérés
    			}
    		}
    		else{console.log("erreur getId().");}
    	});
     
    	return id;
    }
    cette fonction s’exécute au moment qu'un utilisateur rejoint la socket.io :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    connectionDatabase.connect(function(erreur){
    if(!erreur){
        console.log("getId (toufik):"+getId(received_data.user)+" getId() (benahmed) :"+getId("xxxxxx"));// le problème est ici, getId() retourne toujours undefined, alors que dans la fonction getId(), la console affiche bien les id !
    }
    });
    quelqu'un pourrait m'expliquer pourquoi je reçois undefined ?

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Dans ta boucle for, la valeur de id de la dernière itération écrase les précédentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    			for(i in lignes){
    				id=lignes[i].id_personne;
    				…
    			}
    		}});
     
    	return id;
    }
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 412
    Points : 4 854
    Points
    4 854
    Par défaut
    merci d'avoir pris le temps de me lire Watilin.
    je préfère laisser le Php s'occuper des requêtes mysql au lieu de socket.io , par-ce-que il y'a un certain décalage en millisecondes (a cause de l'asynchrone de socket.io) avant de recevoir les données.
    ce que je fais maintenant, c'est laisser socket.io s'occuper des messages instantanés, puis juste après avoir reçu les messages, je lance une requête ajax pour les enregistrer dans la base de donnée.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Je ne suis pas sûr de comprendre. Tu me dis que tu as résolu ton problème ?

    Au fait, fais attention, ta variable id n’est pas déclarée, du coup elle est globale. Envisage de passer au mode strict.

    Attention également, la boucle for..in peut s’avérer traître. Puisque tu es sous Node, tu devrais pouvoir utiliser for..of sans souci de compatibilité.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 412
    Points : 4 854
    Points
    4 854
    Par défaut
    non, je n'ai pas encore résolu le problème , mais je veux changer la manière d'y procéder .
    a vrai dire, je n'ai pas encore les idées bien claires pour l'instant , je vais essayer de vous expliquer.
    je fais un système de gestion de discussions instantanées, qui permet a tous les utilisateurs d'échanger des messages (texte,audio,vidéo,émoticônes) entre eux.
    pour cela j'ai utilisé socket.io et Nodejs.
    maintenant je pense comment faire pour enregistrer les conversations entre les utilisateurs ?, par-ce-que si j'enregistre chaque message envoyé dans la base de donnée, a un certain moment, la table mysql sera pleine et je crois que c'est à éviter.
    je pense a une idée un peu ordinaire, c'est de sauvegarder les conversations dans des fichiers .json qui seront générer et gérer automatiquement par Nodejs. pour chaque 2 utilisateurs, il y'aura un fichier .json sauvegarder dans un dossier bien précis, qui contient toutes les conversations, puis il me reste qu'a traiter avec ces fichiers.json.
    ça me semble pratique si je ne me trompes pas. non?

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Si tu te soucies de saturer ta base de données, tu devrais aussi te soucier de saturer ton quota d’espace disque.

    Mais avant d’être à court d’espace, tu vas rencontrer un autre problème, celui de la performance. Les bases de données ont été conçues, entre autres raisons, parce que les fichiers n’offraient pas un système de stockage assez efficace. Avec les fichiers, tu as déjà un délai incompressible à cause de fopen ; lors des modifications tu te retrouves avec de la fragmentation, et lors des consultations tu as des temps de recherche sous-optimaux parce que les données sont mal organisées (le système de fichiers n’a pas connaissance de la structure d’un fichier JSON).

    Comme solution hybride, je pense que tu peux archiver dans des fichiers JSON le contenu de ta base le moins fréquemment/récemment utilisé, lors des périodes où ton service est peu utilisé (par exemple la nuit), à l’aide d’une tâche Cron.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Le défaut fondamental est qu'avant de retrouver getId, les lignes après qui dépendent de getId et de username sont déjà exécutées.
    Pour simplifier, supposons les lignes utilisent getId sont super simple ; une seule ligne de console.log('user='+username+', id='+getId);, la structure de code original ressemble ceci :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fondamentalement défectif
    var username="Toufik83";
     
    getId=function(username) {
        //etc... code-bloc
        return id;
    }
    //le code-bloc utilisant getId, à titre d'exemple ceci
    console.log('user='+username+', id='+getId);
    Pour proprement observer la nature asynchoneité, on doit réécrire le code comme ça :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var username="Toufik83";
    travailleur(username, callback);
     
    function callback(username, getId) {
        //le code-bloc utilisant getId, à titre d'exemple ceci
        console.log('user='+username+', id='+getId);
    }
     
    function travailleur(username, callback) {
        //etc... code-bloc <<< exactement la même écrit là
        //return id;    //remplacée
        callback(username, id):
    }
    On doit assurer qu'on trouve une id au lieu de rien etc... mais c'est quelque chose dans le code-bloc existé déjà qu'on doit s'occuper ultérieurement.

  8. #8
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 412
    Points : 4 854
    Points
    4 854
    Par défaut
    Citation Envoyé par Watilin
    Attention également, la boucle for..in peut s’avérer traître.
    effectivement, j'ai enlevé toute la boucle for, vu que je peux utiliser lignes[0].id_personne sans avoir boucler.

    Citation Envoyé par Watilin
    Comme solution hybride, je pense que tu peux archiver dans des fichiers JSON le contenu de ta base le moins fréquemment/récemment utilisé, lors des périodes où ton service est peu utilisé (par exemple la nuit), à l’aide d’une tâche Cron.
    merci pour les réponses très enrichissantes, je ne savais pas qu'ils existent des tâches Cron. j'ai un champ datetime dans ma table, ça m'aiderait pour déterminer le contenu le moins utilisé.
    Citation Envoyé par tsuji
    On doit assurer qu'on trouve une id au lieu de rien etc... mais c'est quelque chose dans le code-bloc existé déjà qu'on doit s'occuper ultérieurement.
    finalement j'ai compris quand est-ce qu'on doit utiliser ce genre de callback.
    j'ai rectifié mon code comme suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    var user={id:null,name:null},id_emeteur,id_destinataire;
    getId=function(username,callback){
    	connectionDatabase.query("select * from personne where nom=?",[username],function(erreur,lignes){
    		if(!erreur){
    		user.id=lignes[0].id_personne;
    		callback(null,user.id);
                    //console.log("length lignes :"+lignes.length+" lignes[0].id_personne :"+lignes[0].id_personne);
    		}
    		else callback(erreur,null);
    	});
    }
    io.of("/chemin_perso/").on("connection",function(socket){
            connectionDatabase= mysql.createConnection({
    		host:'localhost',user:'root',password:'',database:"dbname"
    	});
            socket.on("message",function(msg){
                    getId(msg.emeteur,function(err,id){
    			if(!err) id_emeteur=id;
    		});
    		getId(msg.destinataire,function(err,id){
    			if(!err) id_destinataire=id;
    		});
    	console.log("id emeteur:"+id_emeteur+" id dest :"+id_destinataire); //résultat correcte.
            });
    });

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Fonction success retourne “UNDEFINED” avec CFC query
    Par coeurdange dans le forum jQuery
    Réponses: 3
    Dernier message: 24/09/2015, 11h26
  2. Réponses: 3
    Dernier message: 08/08/2010, 23h12
  3. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45
  4. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  5. [Manip de fichiers] Fonction retournant des infos
    Par sans_atouts dans le forum C
    Réponses: 3
    Dernier message: 24/07/2002, 14h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo