Ensuite nous allons créer le fichier ./src/config/db.js où nous allons déclarer un pool de connexion à notre BD. Notez aussi que j'utilise le module dotenv pour enregistrer les informations de connexion à la base de données
Note
On aurait aussi pu créer une connexion au lieu d'un pool, mais ce dernier est mieux adapté pour gérer de multiples utilisateurs. Pour plus de détail, cet article (anglais) résume bien la situation : Why is Connection Pooling better than Single Connection
Maintenant pour lancer des requêtes à notre base de données MySQL il suffit d'importer le module db qu'on vient de créer et d'utiliser la fonction query()
// À ajuster selon votre structureimportdbfrom'../config/db.js';...constrequete=`SELECT nom, prenom FROM professeurs WHERE id = ?`;// Les paramètres doivent toujours être passés sous forme de tableau, // même quand il n'y en a qu'un.constparams=[id]db.query(requete,params,(erreur,resultat)=>{// fonction à exécuter une fois la requête exécutée// erreur : Si une erreur SQL est survenur, objet contentant des informations sur celle-ci// resultat : Le résultat de la requète sous forme d'un tableau d'objets.});
Attention l'objet resultat est toujours un tableau d'objets, même s'il n'y a qu'une ligne de résultat. Si on veut accéder à la valeur d'une colonne de la première ligne de résultat par exemple on peut faire resultat[0].nomColonneDansLaRequête. Dans l'exemple plus haut resultat[0].prenom me retournerait le prénom du professeur de la première ligne de résultat.
Dans l'objet erreur vous pouvez récupérer des informations sur l'erreur comme le code d'erreur SQL (erreur.sqlState) et un message explicatif (erreur.sqlMessage).
// À ajuster selon la structureimportexpressfrom'express';import{trouverUnProfesseur}from'../controllers/professeurs.controller.js';constrouter=express.Router();router.get('/:id',trouverUnProfesseur);exportdefaultrouter;
// À ajuster selon la structureimportprofesseursModelfrom"../models/professeurs.model.js";consttrouverUnProfesseur=async(req,res)=>{// Teste si le paramètre id est présent et valideif(!req.params.id||parseInt(req.params.id)<=0){res.status(400);res.send({message:"L'id du professeur est obligatoire et doit être supérieur à 0"});return;}// Appel à la fonction getProfesseur dans le modèleawaitprofesseursModel.getProfesseur(req.params.id)// Si c'est un succès.then((professeur)=>{// S'il n'y a aucun résultat, on retourne un message d'erreur avec le code 404if(!professeur[0]){res.status(404);res.send({message:`Professeur introuvable avec l'id ${req.params.id}`});return;}// Sinon on retourne le premier objet du tableau de résultat car on ne devrait avoir qu'un professeur par idres.send(professeur[0]);})// S'il y a eu une erreur au niveau de la requête, on retourne un erreur 500 car c'est du serveur que provient l'erreur..catch((erreur)=>{console.log('Erreur : ',erreur);res.status(500)res.send({message:"Erreur lors de la récupération du professeur avec l'id "+req.params.id});});};export{trouverUnProfesseur}
// À ajuster selon la structureimportdbfrom'../config/db.js';constgetProfesseur=(id)=>{returnnewPromise((resolve,reject)=>{constrequete=`SELECT nom, prenom FROM professeurs WHERE id = ?`;constparams=[id]db.query(requete,params,(erreur,resultat)=>{if(erreur){console.log(`Erreur sqlState ${erreur.sqlState} : ${erreur.sqlMessage}`);// S'il y a une erreur, je la retourne avec reject()reject(erreur);}// Sinon je retourne le résultat sans faire de validation, c'est possible que le résultat soit videresolve(resultat);});});};exportdefault{getProfesseur}