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);
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 ?
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
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);
});
}
};
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 !
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.
yasakani no magatama
suggestion de présentation.