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
    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é
    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
    À 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.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Candidat au Club
    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
    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
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.