Partage
  • Partager sur Facebook
  • Partager sur Twitter

Node.js : creation de variable globale.

Creer une variable dans fonction pour utiliser dans tout le fichier

    26 janvier 2020 à 4:24:35

    Bonjour, j'utilise Nodejs pour faire des requêtes SQL, et j'aimerais enregistrer le résultat de cette recette dans une variable globale, afin de l'utiliser dans le reste du fichier, j'ai essayer d'utiliser express et le global.storage, mais pas de resultat pour l'instant, la console m'affiche undefined, mon code est si dessous :

    test.js

    var mysql = require('mysql');
    
    
    
    var con = mysql.createConnection({
      host: "localhost",
      user: "root",
      password: "",
      database: "espace_membre"
    });
    
     var pseudo1 = "amine"; 
    	
    var socketid = '3485858585'; 
    
    var peerId = '4444'; 
    
    con.connect(function(err) {
     
      con.query("SELECT gender FROM gender WHERE socketid = '" + peerId + "'", function (err, result) {
       
        // console.log(result);
    	
    	 global.result; 
    
    	global.result= result; 
    
    
    
    
    
      });
    });
    
    console.log(result);
    
    
    



    • Partager sur Facebook
    • Partager sur Twitter
      26 janvier 2020 à 15:42:49

      Les globale c'est la porte ouverte à tous les hackers.

      Pourquoi tu ne fais juste pas un juste un return de result ? 

      Tu englobe ta logique dans une fonction que tu vas stocker dans ton modèle, tu finis ton model par un return result; dans ton controller tu appel cette fonction et tu l'appel comme tu veux.

      Tu connais l'architecture MVC?

      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2020 à 18:17:25

        Merci de ta réponse, je ne connaissais pas l'architecture MVC donc je me suis un peu renseigné, j'ai changer mon code en fonction de ce que tu a dis, est ce que c'est censé ressembler a ce qui suit ?
        var mysql = require('mysql');
        
        
        
        var con = mysql.createConnection({
          host: "localhost",
          user: "root",
          password: "",
          database: "espace_membre"
        });
        
        
         var pseudo1 = "amine"; 
        	
        var socketid = '3485858585'; 
        
        var peerId = '4444'; 
        
        
        function sql() {
          
        
        
        con.connect(function(err) {
         
          con.query("SELECT gender FROM gender WHERE socketid = '" + peerId + "'", function (err, result) {
           
            // console.log(result);
        	
        	
        	return result 
        
        
        
        
          });
        });
        
        
        }
        
        sql(); 
        
        console.log(result);
        • Partager sur Facebook
        • Partager sur Twitter
          26 janvier 2020 à 18:35:07

          Tu t'en rapproches mais c'est toujours pas ça. L'architecture MVC c'est une méthode de structuration du code en séparant les modèle ou tu fais les différents traitement comme les requêtes SQL (dossier et fichier à part), la Vue qui affiche ton contenue, et Controller qui sert un peu d'aiguilleur.
          Ca permet d'avoir un code propre, bien organisé et qui possède une structure duplicable sur chaque projet, avec cette maitrise je pense que tu n'aurais pas eu ce problème; c'est presque plus important que la connaissance d'une techno back ;) 

          Ton result doit être à l'extérieur de ta requête SQL. Désolé j'utilise du NoSQL sur node j'ai un peu de mal à corriger la partie de la requête en elle même; mais ça me semble déjà bien mieux


          • Partager sur Facebook
          • Partager sur Twitter
            26 janvier 2020 à 21:16:42

            bonjour le callback qui reçoit les resultats étant passé en paramètre à une autre fonction le return situé à l'intérieur ( line 31 ) , aura "un peut de mal" à être capturé par une valeur de gauche ( qui d'ailleurs n'existe pas ) ...

            con.connect(function(err) {
              
              con.query("SELECT gender FROM gender WHERE socketid = '" + peerId + "'", function (err, result) {
                
                // console.log(result);
                 
               
                // ici tu return une valeur que la fonction connect de l'object conn reçoit ( car ces lui qui éxecute ton callback ) mais cette valeur de retour l'objet conn ne te le renvoi pas  ...  
                return result
             
             
              });
            });

            l'architecture MVC tu seras utile uniquement si tu travaille avec des vues et un serveur HTTP où TCP/IP UDP , ici ne montrant qu'une requête SQL ton application n'en pas forcément la nécessité ( ni forcément la possibilité de l'implémenté ) ,

            ce n'est d'ailleur pas la seul structure de project existante il y en à d'autre performente comme l'architecture flux ( mis en avant par Reactjs et facebook open source ) , qui fonctionnent très bien aussi , MVC n'est pas indispensable .

             n'aillant rien trouvé sur les risques des variables globales avec nodejs vu la structure en l'étant actuel pourquoi ne pas en déclaré une de plus en haut du fichier l'initialisé à null et l'affecté post traitement de la requête , e.g :

            var mysql = require('mysql');
             
             
             
            var con = mysql.createConnection({
              host: "localhost",
              user: "root",
              password: "",
              database: "espace_membre"
            });
             
             var pseudo1 = "amine";
                 
            var socketid = '3485858585';
             
            var peerId = '4444';
            
            var sqlResult = null ; // stockera une sortie SQL
             
            con.connect(function(err) {
              
              con.query("SELECT gender FROM gender WHERE socketid = '" + peerId + "'", function (err, result) {
                
                // console.log(result);
             
                // affect la sortie à la variable global
                sqlResult = result;
             
             
              });
            });
             
            console.log( sqlResult );
            



            -
            Edité par SamuelGaborieau3 26 janvier 2020 à 23:46:32

            • Partager sur Facebook
            • Partager sur Twitter

            suggestion de présentation.

              26 janvier 2020 à 21:47:55

              Merci pour vos réponses, j'ai essayer le code donné par SamuelGaborieau3, et la console me renvoie null.
              • Partager sur Facebook
              • Partager sur Twitter
                26 janvier 2020 à 23:49:22

                ha oui le console log s'éxecute avant que le callback s'éxecute la variable global n'a pas été affecté avant log c'est à cause de l'execution asynchrone ,

                var mysql = require('mysql');
                  
                  
                  
                var con = mysql.createConnection({
                  host: "localhost",
                  user: "root",
                  password: "",
                  database: "espace_membre"
                });
                  
                 var pseudo1 = "amine";
                      
                var socketid = '3485858585';
                  
                var peerId = '4444';
                 
                var sqlResult = null ; // stockera une sortie SQL
                  
                // 1
                con.connect(function(err) {
                   
                  con.query("SELECT gender FROM gender WHERE socketid = '" + peerId + "'", function (err, result) {
                    
                    // 3
                 
                    
                    // affect la sortie à la variable global
                    sqlResult = result;
                  
                  
                  });
                });
                
                // 2
                console.log( sqlResult );

                tu peut ( exemple arbitraire ) , executé une fonction qui elle et dans l'espace global où écrire directement le corps dans le callback selon ce que tu as besoin de faire e.g :

                var mysql = require('mysql');
                  
                  
                  
                var con = mysql.createConnection({
                  host: "localhost",
                  user: "root",
                  password: "",
                  database: "espace_membre"
                });
                  
                 var pseudo1 = "amine";
                      
                var socketid = '3485858585';
                  
                var peerId = '4444';
                 
                var sqlResult = null ; // stockera une sortie SQL
                
                function resultReceveid() {
                
                   
                    console.log( sqlResult );
                }
                
                con.connect(function(err) {
                   
                  con.query("SELECT gender FROM gender WHERE socketid = '" + peerId + "'", function (err, result) {
                     
                    // console.log(result);
                  
                    // affect la sortie à la variable global
                    sqlResult = result;
                
                    resultReceveid() ;
                  
                  
                  });
                });
                




                -
                Edité par SamuelGaborieau3 26 janvier 2020 à 23:51:52

                • Partager sur Facebook
                • Partager sur Twitter

                suggestion de présentation.

                  27 janvier 2020 à 8:55:05

                  Voici un première exemple de comment faire avec des callbacks :

                  // const à la place de var vu que la variable
                  // n'a pas besoin d'être modifier après affectation
                  const mysql = require('mysql')
                  
                  const connection = mysql.createConnection({
                      host: 'localhost',
                      user: 'root',
                      password: '',
                      database: 'espace_membre'
                  })
                  
                  function connectDatabase() {
                      connection.connect((err) => {
                          if (err) {
                              console.error('Erreur pour se connecter à la bdd : ' + err.stack)
                              return null
                          }
                      
                          console.log('Connexion à la bdd effectué !')
                          getGender()
                      })
                  }
                  
                  function getGender() {
                      let pseudo = 'amine'
                      let socketId = '3485858585'
                      let peerId = '4444'
                  
                      connectDatabase.query('SELECT gender FROM gender WHERE socketid = ?', [peerId], (errors, rows) => {
                          if (errors) {
                              console.log('Erreur lors de la requête' + errors)
                              return null
                          }
                  
                          nextProcess(rows[0])
                      })
                  }
                  
                  function nextProcess(data) {
                      console.log(data)
                  }
                  
                  connectDatabase()
                  


                  Voici une version plus avancée qui utilise les nouveauté (qui existe depuis un petit moment déjà :D ) du js avec les promises et async / await :

                  (pour plus de détails voici une vidéo qui explique ces concepts :
                  https://www.grafikart.fr/tutoriels/promise-async-await-875 )

                  // On pourrait largement séparer en plusieurs fichiers
                  
                  const mysql = require('mysql')
                  
                  class Database {
                      constructor (hostname, username, userpass, dbname) {
                          this.connection = mysql.createConnection({
                              host: hostname,
                              user: username,
                              password: userpass,
                              database: dbname
                          })
                      }
                  
                      connect () {
                          return new Promise((resolve, reject) => {
                              this.connection.connect((errors) => {
                                  if (errors) {
                                      reject(errors)
                                      return null
                                  }
                  
                                  resolve(this)
                              })
                          })
                      }
                  
                      query (statement, params) {
                          return new Promise((resolve, reject) => {
                              this.connection.query(statement, params, (errors, rows, fields) => {
                                  if (errors) {
                                      reject(errors)
                                      return null
                                  }
                  
                                  resolve({
                                      rows,
                                      fields
                                  })
                              })
                          })
                      }
                  }
                  
                  // Fichier principale
                  async function run() {
                      // Du coup c'est un peu moins global niveau variable
                      let pseudo = 'amine'
                      let socketId = '3485858585'
                      let peerId = '4444'
                  
                      const db = new Database('localhost', 'root', '', 'espace_membre')
                      await db.connect()
                      
                      const genderStatement = 'SELECT gender FROM gender WHERE socketid = ?'
                      const { rows: genders } = await db.query(genderStatement, [peerId])
                  
                      console.log(genders)
                  }
                  
                  run()
                      .then(() => {
                          console.log('Success')
                      })
                      .catch((err) => {
                          console.error('Error', err)
                      })
                  

                  Je pense que avant de vouloir faire un projet node, il faut bien comprendre et pratiquer l'asynchrone de Javascript car sinon le code peut vite devenir une horreur à lire et à comprendre. Surtout que maintenant avec ES2019, ES2020, ça va faire 3, 4 ans que l'on peut faire du code js beaucoup plus propre syntaxiquement parlant.

                  -
                  Edité par quenti77 27 janvier 2020 à 8:56:13

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 janvier 2020 à 14:37:07

                    Merci de vos réponses, le code de  SamuelGaborieau3 m'a permis d'afficher la variable, et je vais étudier les callbacks sur le lien que quenti77 m'a envoyer, afin d'avoir un meilleur code.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Node.js : creation de variable globale.

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown