Structure d'un projet avec Express
Express est hautement configurable et permet en grande partie d'utiliser la structure de projet que l'on souhaite. Pour le cours nous allons adopter une approche dans laquelle nous allons séparer les routes, le controlleur où sera fait la logique applicative et l'accès aux données.
- Modèle : Gestion des interactions avec la base de données. C'est ici que nous ferons nos requêtes et retourneront les résultats bruts.
- Route : Une série de routes (endpoint). Chaque route fera appel à une fonction du controlleur, il n'y a pas vraiment de traitement qui se fera à ce niveau.
- Controlleur : C'est ici qu'a lieu la logique applicative, avec des appels au modèle si besoin est.
À la racine du projet :
- .env : Contient les variables d'environnement qu'on utilise avec le module dotenv.
- package.json : La "recette" pour construire votre application, on y retrouve les modules à installer et les scripts.
- index.js : Fichier de démarrage de votre application. (ou server.js, app.js, etc..)
- /src : Dossier qui contient la logique de l'application
- /node_modules : Dossier des modules installés, ne jamais rien modifier ou ajouter dans ce répertoire. À ne pas inclure dans vos dépôts Git (à ajouter au .gitignore), ce dossier peut facilement être "reconstruit" grâce à la commande
npm install.
Dans le dossier src :
- /config : Les fichiers de configuration, comme la connexion à la base de données (db.js dans mon exemple).
- /controllers : Les fichiers controlleurs où la logique applicative est écrite. Nommez-les nomDeLaRessource.controller.js pour plus de clarté.
- /models : Les fichiers modèles qui s'occuperont de la communication avec la base de données. Nommez-les nomDeLaRessource.model.js pour plus de clarté.
- /routes : Les fichiers de routage qui essentiellement appelleront le bon controlleur. Nommez-les nomDeLaRessource.route.js pour plus de clarté.
Un exemple de fichier controlleur:
controllers/produits.controller.js
import { produits } from '../models/produits.model.js';
export const getProduits = (req, res) => {
// Logique pour obtenir les produits
res.json(produits.<TODO>)
};
export const createProduit = (req, res) => {
// Logique pour créer un produit
// produits.<TODO>
};
Les fichiers *route.js ne font qu'associer les routes à une fonction du controlleur. Par exemple dans le fichier produits.route.js on pourrait avoir: