Construire ton server.js avec Node.js + Express + MySQL
construire ton server.js avec Node.js + Express + MySQL
-
Objectif
-
Créer un serveur Node.js avec Express et MySQL pour CRUD
-
Étape 1 : Installer les dépendances
- Ouvrez un terminal dans votre projet Node.js.
- Installez les packages nécessaires :
- Explication :
- express : framework pour créer le serveur web.
- mysql2 : pour se connecter à MySQL.
- cors : autorise les requêtes entre frontend et backend.
- nodemon : redémarre automatiquement le serveur à chaque modification.
-
Étape 2 : Créer le fichier server.js
- À la racine du projet, créez un fichier
server.js
. - Importez les modules :
- Initialisez Express et configurez les middlewares :
- Règles pour les middlewares :
CORS
en premier – Sécurité d’abordexpress.json()
obligatoire – Pour lire le body des requêtes POST/PUT- Toujours appeler
app.use()
– Sinon les middlewares ne fonctionnent pas -
Étape 3 : Configurer la connexion MySQL
- Créez la connexion à la base de données :
- Explication : on teste la connexion et on affiche un message si elle réussit.
-
Étape 4 : Créer les routes CRUD
- Pattern général pour toutes les routes :
- Correspondance Méthode HTTP ↔ Action :
-
Lire les cours (
GET
) - Points de contrôle :
- Vérifier que app.get est utilisé (pas app.post)
- Tester avec le navigateur sur http://localhost:5000/cours
- Voir les logs dans la console
-
Ajouter un cours (
POST
) - Règles POST :
- Validation des données – Vérifier que tous les champs sont présents
- Requêtes préparées – Utiliser ? pour éviter les injections SQL
- Tableau de valeurs – Passer les valeurs dans un tableau [titre, description]
- Réponse informative – Retourner l’ID généré et les données créées
-
Modifier un cours (PUT)
-
Supprimer un cours (DELETE)
-
Étape 5 : Lancer le serveur
- Ajoutez la commande pour écouter sur le port 5000 :
- Maintenant, vous pouvez tester vos routes CRUD depuis le frontend ou avec Postman.
# À FAIRE :
npm init -y # Initialise le projet Node.js
npm install express mysql2 cors # Installer les dépendances principales
npm install --save-dev nodemon # Outil de développement uniquement
# À ÉVITER :
npm install --global nodemon # Pas d'installation globale
npm install tous les packages sans comprendre leur utilité
// ORDRE CORRECT DES IMPORTS :
const express = require("express");
const mysql = require("mysql2");
const cors = require("cors");
// INITIALISATION DANS L'ORDRE :
const app = express();
// MIDDLEWARES DANS LE BON ORDRE :
app.use(cors()); // 1er : Sécurité CORS
app.use(express.json()); // 2ème : Parseur JSON
const db = mysql.createConnection({
host: "localhost", // Serveur MySQL
user: "root", // À changer en production
password: "", // JAMAIS en clair en production
database: "gestion_cours", // Base doit exister
port: 3306 // Port explicite
});
// TEST DE CONNEXION OBLIGATOIRE :
db.connect((err) => {
if (err) {
console.error(" Erreur MySQL:", err.message);
process.exit(1); // Arrêt immédiat si DB inaccessible
}
console.log("Con necté à MySQL - Base: gestion_cours");
});
app.MÉTHODE("/route/:param", (req, res) => {
// 1. Récupération des données
// 2. Validation des données
// 3. Requête SQL avec gestion d'erreur
// 4. Réponse structurée
});
Méthode HTTP | Action CRUD | Usage pour les cours |
---|---|---|
GET | READ (Lire) | Récupérer la liste des cours |
POST | CREATE (Créer) | Ajouter un nouveau cours |
PUT | UPDATE (Modifier) | Modifier un cours existant |
DELETE | DELETE (Supprimer) | Supprimer un cours |
// BONNES PRATIQUES :
app.get("/cours", (req, res) => {
console.log("Requ ête GET /cours reçue");
const sql = "SELECT * FROM cours ORDER BY id DESC";
db.query(sql, (err, results) => {
if (err) {
console.error(" Erreur SQL:", err.message);
return res.status(500).json({
error: "Erreur base de données"
});
}
console.log(`${results.length} cours récupérés`);
res.json(results);
});
});
// VALIDATION OBLIGATOIRE :
app.post("/cours", (req, res) => {
console.log(" Requête POST /cours reçue", req.body);
// RÈGLE : Toujours valider les données
const { titre, description } = req.body;
if (!titre || !description) {
return res.status(400).json({
error: "Titre et description requis"
});
}
const sql = "INSERT INTO cours (titre, description) VALUES (?, ?)";
db.query(sql, [titre, description], (err, result) => {
if (err) {
console.error(" Erreur insertion:", err.message);
return res.status(500).json({ error: err.message });
}
console.log(` Cours créé - ID: ${result.insertId}`);
res.json({
message: "Cours créé avec succès",
id: result.insertId,
titre,
description
});
});
});
app.put("/cours/:id", (req, res) => {
const { id } = req.params;
const { titre, description } = req.body;
const sql = "UPDATE cours SET titre = ?, description = ? WHERE id = ?";
db.query(sql, [titre, description, id], (err) => {
if (err) return res.status(500).json({ error: err.message });
res.json({ message: "Cours mis à jour avec succès" });
});
});
app.delete("/cours/:id", (req, res) => {
const { id } = req.params;
const sql = "DELETE FROM cours WHERE id = ?";
db.query(sql, [id], (err) => {
if (err) return res.status(500).json({ error: err.message });
res.json({ message: "Cours supprimé avec succès" });
});
});
app.listen(5000, () => {
console.log("Serveur backend démarré sur http://localhost:5000");
});