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 :

Utilisation function query (callback)


Sujet :

NodeJS

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Utilisation function query (callback)
    bonjour je débute en node.js

    Ma question est simple voici mon code

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    var connection = require("./connection.js")
     
    class Service{
     
        constructor(){
     
            this.nom = null;
            this.password = null;
            this.reponse = [];
     
        }
     
         afficher(cb){
     
     
             connection.query("select * from client",(err,rows)=>{
                if(err) throw err
     
                this.nom = rows[0].pseudo     // ne fonctionne pas du tout car this.nom = ne va pas changer de valeur
                this.password = rows[0].password // // // //
                this.reponse = rows // //  // 
               cb(rows)
     
            })         
        }
     
     
        getNom(){
            return this.nom;
     
        }
        getPassword(){
            return this.password;
        }
     
     
        getReponse(){
            return this.reponse;
        }
    }
     
    module.exports = Service

    donc lorsque je fais dans ma page demande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var service= require("./service.js")
     
    service = new service();
    console.log(user.getNom())     // j'ai null
    si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    user.afficher((result)=>{
     
        console.log(result[0].pseudo) // j'ai la réponse mais ça ne change rien 
    })
     
    console.log(user.getNom() // j'ai toujours null

    mon objectif premier est de mettre les info dans utilisateur = [ nom : uset.getNom() ......]; et ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    module.exports = utilisateur
    merci d'une réponse simple pour un débutant comme moi

  2. #2
    Expert confirmé Avatar de psychadelic
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    2 529
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 2 529
    Points : 4 740
    Points
    4 740
    Par défaut
    Cb est une méthode asynchrone, donc espérer voir les variables internes par la class Service immédiatement accessibles est illusoire
    «La pluralité des voix n'est pas une preuve, pour les vérités malaisées à découvrir, tant il est bien plus vraisemblable qu'un homme seul les ait rencontrées que tout un peuple.» [ René Descartes ] - Discours de la méthode

  3. #3
    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
    À propos de ce passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    user.afficher((result) => {
      console.log(result[0].pseudo); // j'ai la reponse mais ca ne change rien
    });
     
    console.log(user.getNom()); // toujours null
    Dans la méthode .afficher(), il y a un appel à une certaine fonction connection.query() qui m’a tout l’air d’être asynchrone. Ça veut dire que son résultat n’arrive pas tout de suite. En attendant, le reste du code s’exécute. Quand le fil d’exécution arrive sur console.log(user.getNom()), le nom est null parce que la callback n’a pas encore été exécutée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    "connection.query()" ---> attente du résultat
        |                           |
        |                           |
        v                           |
    "console.log(user.getNom())"    |
                                    |
                                    |
        ,---------------------------’
        |
        v
    "this.nom = rows[0].pseudo"
    Pour rester dans la chronologie, tu dois placer tout le code qui dépend du résultat de query() dans la callback.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    user.afficher((result) => {
      ... // utilise user.getNom() ici
    });
    Faire un export dans ces conditions n’est pas une bonne idée. En fait, l’instruction export est faite pour des structures statiques : des classes, des fonctions, des espaces de noms, etc. Au sens large, les outils utilisés par ton application, pas les données.
    Si tu veux vraiment exporter les données de ta base SQL, il faudrait que le module appelant soit notifié au moment où le résultat est prêt, ce qui suppose de mettre en œuvre un mécanisme de notification entre les modules, bref tout un tas de complications pour pas grand chose.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    enfaite je dois faire cela pour l'utiliser dans mon router comme ceci
    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
     
     
    router.js
    ----------
    const express = require("express");
    let user= require("../model/utilisateur") // ainsi les données récolter son exploitable ici
     
     
     
    router.get("/list", async (req,res) =>{
     
        try{
            res.status(200).json({
                data : user                      // ici
     
            })
        } catch(err){
            res.status(400).json({
                message: "Some error occured",
                err
              });
        }
    });
     
     
    module.exports = router;
    donc si je comprend bien vaut mieux utiliser directement ici mon fichier utilisateur et faire appel comme ceci

    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
     
       afficher((res=>{
     
    router.get("/list", async (req,res) =>{
     
        try{
            res.status(200).json({
                data : user
     
            })
        } catch(err){
            res.status(400).json({
                message: "Some error occured",
                err
              });
        }
    });
     
     
     
    )
     
     
    un truc du genre?

  5. #5
    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
    Oui, mais je ne suis pas sûr de ce qui se passe quand on n’appelle pas router.get dans l’exécution initiale du script. Ça dépend de la mécanique interne d’Express, c’est pas quelque chose que je maîtrise.
    Je pense qu’il vaudrait mieux que tu appelles afficher() au sein de la fonction (req,res) => {}. Et attention aux conflits de noms : le nom de variable res est utilisé dans deux fonctions différentes, tu vas devoir corriger ça
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Réponses: 13
    Dernier message: 09/02/2007, 16h15
  2. utilisation de Query dans C++
    Par cpf2006 dans le forum C++
    Réponses: 5
    Dernier message: 02/02/2007, 14h11
  3. Utilisation des queries
    Par mchicoix dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/08/2006, 09h21
  4. Comment utiliser un query à partir d'un timedatepicker ?
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 10
    Dernier message: 24/08/2005, 17h20
  5. Écriture dans un DBgrid quand utilise un query comme dataset
    Par dcayou dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 22h22

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