MySQL avec Express.js
Installation
Pour nous permettre d'interragir avec une base de données MySQL nous allons installer un nouveau module avec npm: mysql2.
Création du pool de connexions
Ensuite nous allons créer le fichier ./src/config/db.js où nous allons déclarer un pool de connexions à 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
MYSQL_HOST="localhost"
MYSQL_USER="root"
MYSQL_PASSWORD=""
MYSQL_DATABASE="<nom_bd>"
MYSQL_CONNECTION_LIMIT = 10
Mysql
Le mot de passe par défaut pour l'utilisateur root dans devilbox est une chaîne vide.
Utilisation
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()
Attention: l'objet resultats est toujours un tableau d'objets, même s'il n'y a qu'une ligne de résultats.
Si on veut accéder à la valeur d'une colonne de la première ligne de résultats on peut faire resultat[0].nomColonne. Dans l'exemple plus haut resultats[0].prenom me retournerait le prénom du professeur de la première ligne de résultats.
Sur erreur (ex: problème de connexion à la base de données, erreur dans la requête SQL, etc.) une exception est levée et on peut la capturer avec un bloc try...catch.
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).
| script.js | |
|---|---|
L'appel à db.query retourne une promesse (Promise). C'est pourquoi on utilise await pour attendre la résolution de cette promesse. Pour plus de détail sur les promesses, voir la page sur l'asynchronisme.
Si on utilise await dans une fonction, il faut que cette fonction soit déclarée avec le mot-clé async. Ici, nous sommes dans le contexte d'un module ES6 (fichier avec extension .js et utilisant des instructions import et export), donc on peut utiliser await directement au niveau supérieur du module.
Exemple Express.js + MySQL
Voici un exemple complet d'une requête SELECT avec le modèle, la route et le controleur.
Exercice 3b: MySQL et Express.js
L'exercice consiste à compléter l'exemple ci-dessus en ajoutant la gestion du cas où aucun professeur n'est trouvé dans la base de données. Dans ce cas, le serveur doit retourner un code 404 avec un message d'erreur approprié.
Étapes
- Créez une base de données MySQL (conteneur sous devilbox) avec une table
professeurscontenant au moins les colonnesid,nom, etprenom. - Insérez quelques enregistrements dans la table
professeurs. - Créez un nouveau projet Node.js avec la structure de dossiers appropriée (controllers, models, routes, config)
- Installez les dépendances nécessaires (
express,mysql2,dotenv, etc.) - Complétez la fonction
trouverUnProfesseurdans le contrôleurprofesseurs.controller.jspour gérer le cas où aucun professeur n'est trouvé. - Testez votre API en utilisant Postman
- GET avec un code valide (200 OK)
- GET avec un code inexistant (doit retourner 404)