Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête SQL NodeJS

Requête SQL en fct du résultat d'une autre requête

Sujet résolu
    25 mai 2022 à 13:43:29

    Bonjour,

    Je commence à coder et je suis en train d'essayer de faire mon CRUD User pour mon application. Ce que je veux c'est que dans ma fonction User.getAll, si l'utilisateur passe dans l'url de l'api le nom d'une société (?societe=nomSociete), et bien je veux lui sortir la liste de tous les users qui font partis de cette société. Dans ma BDD, les users sont rattaché à une société par l'id_societe.

    Vous avez le code de ma fonction User.getAll ci-dessous.

    User.getAll = (societe, result) => {
        var idSociete;
        //requete sql pour afficher tous les utilisateurs
        let query = "SELECT * FROM utilisateur";
        //Si on demande les utilisaterus d'une societe en particulier
        if (societe) {
            //requete sql pour déterminer l'id de la societe demandée
            var queryIdSociete = `SELECT id FROM societe WHERE societe.nom = '${societe}'`;
             //on exécute la requete queryIdSociete pour déterminer l'id
            sql.query(queryIdSociete, (err, res) => {
                if (err) {
                console.log("error: ", err);
                result(null, err);
                return;
                }
                result(null, res);
                idSociete = res[0].id;
                console.log (idSociete)
            });
            console.log("L'id de la societe : " + societe + " est : " + idSociete);
            query += ` WHERE id_societe = ${idSociete}`;
        }
    
        //On exécute la requete finale
        sql.query(query, (err, res) => {
            if (err) {
            console.log("error: ", err);
            result(null, err);
            return;
            }
            console.log("users : ", res);
            result(null, res);
        });
    };

    Le problème c'est que cette requête semble s'exécuter après le

    console.log("L'id de la societe : " + societe + " est : " + idSociete);

    query += ` WHERE id_societe = ${idSociete}`;

    De ce fait lorsque je test sur postman : http://localhost:8080/api/users?societe=nomSociete1

    La console me renvoi :

    L'id de la societe : nomSociete1 est : undefined

    1

    code: 'ERR_HTTP_HEADERS_SENT'

    Ca me met donc une erreur puisque l'id societe n'est pas définit, est-ce que je dois créer une autre fonction qui fait uniquement la query de l'id et je dois utiliser cette fonction dans mon getAll ?

    Merci.

    -
    Edité par Abakus 25 mai 2022 à 14:45:55

    • Partager sur Facebook
    • Partager sur Twitter
      25 mai 2022 à 23:47:19

      Bonjour c'est simplement le principe de l'asynchrone il te faudra attendre que la requete reussisse avant de tenter d'en afficher le resultat donc par exemple ici si tu as besoin du resultat de la premiere requete pour faire la deuxieme une des choses que tu pourrais faire est de monter le deuxieme dans le retour de la première

      Au lieu de faire de la concaténation sur des données qui ne proviennent pas de toi pense à préparer tes requêtes je ne sais pas quelle module de base de données tu utilises mais elle devrait proposer cette option 

      -
      Edité par zvheer 25 mai 2022 à 23:53:43

      • Partager sur Facebook
      • Partager sur Twitter

      yasakani no magatama

        26 mai 2022 à 11:11:42

        Oui effectivement il y à un problème de gestion du code asynchrone, ce block là est mal géré:

                // 1. on exécute la requete queryIdSociete pour déterminer l'id
                sql.query(queryIdSociete, (err, res) => {
                    // 3. on récupére le résultat de la requête:
                    if (err) {
                    console.log("error: ", err);
                    result(null, err);
                    return;
                    }
                    result(null, res);
                    idSociete = res[0].id;
                    console.log (idSociete)
                });
                // 2. le reste du code s'exécute sans attendre le résultat de la requête précédente,
                // ici idSociete devrait être "undefined"
                // ce qui va construire la requête:
                //  "SELECT * FROM utilisateur WHERE id_societe = undefined"
                console.log("L'id de la societe : " + societe + " est : " + idSociete);
                query += ` WHERE id_societe = ${idSociete}`;

        Ce block est exécuté dans le cas ou le paramètre "societe" est envoyé à ta fonction.

        Avec les commentaires ci-dessous on vient que le problème vient du code qui est exécuté avant que la requête n'est aboutit.

        Une façon de ré écrire de code pourrait être:

        User.getAll = (societe, result) => {
            var idSociete;
            //requete sql pour afficher tous les utilisateurs:
            let query = "SELECT * FROM utilisateur";
        
            //Si on demande les utilisaterus d'une societe en particulier
            if (societe) {
        
                //requete sql pour déterminer l'id de la societe demandée:
                var queryIdSociete = `SELECT id FROM societe WHERE societe.nom = '${societe}'`;
        
                 //on exécute la requete queryIdSociete pour déterminer l'id:
                sql.query(queryIdSociete, (err, res) => {
                    if (err) {
                        console.log("error: ", err);
                        result(null, err);
                        return;
                    }
        
                    // on ne peut pas renvoyer immédiatement le résultat
                    // il contient uniquement la societé et pas les utilisateurs associé à celle-ci:
                    // result(null, res);
        
                    // à la place de renvoyer le résultat on
                    // met à jour la requête finale à exécuter:
                    idSociete = res[0].id;
                    query += ` WHERE id_societe = ${idSociete}`;
        
                    console.log("L'id de la societe : " + societe + " est : " + idSociete);
        
                    // puis on demande à exécuter la requête finale:
                    runFinalRequest();
                });
            } else {
                // sinon on exécute directement la requête finale:
                runFinalRequest();
            }
        
            const runFinalRequest = () => {
                //On exécute la requete finale
                sql.query(query, (err, res) => {
                    if (err) {
                    console.log("error: ", err);
                    result(null, err);
                    return;
                    }
                    console.log("users : ", res);
                    result(null, res);
                });
            }
        
        };




        • Partager sur Facebook
        • Partager sur Twitter

        suggestion de présentation.

          30 mai 2022 à 9:58:24

          Je vous remercie pour toutes vos réponses, j'ai combiné vos propositions de code et l'utilisation des promesses et mon code fonctionne ! Merci encore !
          • Partager sur Facebook
          • Partager sur Twitter

          Requête SQL NodeJS

          × 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