Logo

dev-resources.site

for different kinds of informations.

Comprendre le Design Pattern MVC avec Node.js, Express et MongoDB

Published at
1/6/2025
Categories
designpattern
node
mongodb
express
Author
jethron22
Author
9 person written this
jethron22
open
Comprendre le Design Pattern MVC avec Node.js, Express et MongoDB

Image description

Le design pattern MVC (Model-View-Controller) est une approche populaire pour organiser le code des applications web. Il permet de séparer les responsabilités, rendant le code plus propre, maintenable et évolutif. Dans cet article, nous allons expliquer le concept de MVC et construire un exemple simple avec Node.js, Express, et MongoDB.

  1. Qu'est-ce que le pattern MVC ? Le pattern MVC divise une application en trois parties principales :

Model (Modèle) : Gère les données, les règles métier et la logique. Il interagit souvent avec une base de données.
View (Vue) : Gère l'affichage et l'interface utilisateur. Elle reçoit les données du contrôleur pour les présenter.
Controller (Contrôleur) : Sert de pont entre le modèle et la vue. Il reçoit les requêtes de l'utilisateur, appelle les méthodes du modèle, et envoie les données à la vue.

Exemple visuel d'un flux MVC :

L'utilisateur envoie une requête HTTP via le navigateur.
Le Controller reçoit la requête, interagit avec le Model pour obtenir des données.

Le Model retourne les données au Controller, qui les passe à la View pour l'affichage.

  1. Mise en œuvre de MVC avec Node.js, Express et MongoDB

Nous allons créer une simple application de gestion de tâches. L'utilisateur pourra ajouter, afficher et supprimer des tâches.

Étape 1 : Configuration du projet

Créez un dossier pour votre projet et initialisez un projet Node.js.

Terminal

mkdir mvc-tasks
cd mvc-tasks
npm init -y
Enter fullscreen mode Exit fullscreen mode

Installez les dépendances nécessaires :

Terminal
npm install express mongoose ejs body-parser

Étape 2 : Structure du projet

Organisez votre projet comme suit :

Structure du projet

mvc-tasks/
├── models/        // Contient les fichiers pour le modèle (base de données)
├── views/         // Contient les fichiers pour la vue (HTML, EJS, etc.)
├── controllers/   // Contient les fichiers pour les contrôleurs
├── public/        // Contient les fichiers statiques (CSS, JS, images)
├── app.js         // Point d'entrée de l'application
└── package.json
Enter fullscreen mode Exit fullscreen mode

Étape 3 : Créer le modèle (Model)

Dans le dossier models, créez un fichier Task.js :

code Javascript

import mongoose from "mongoose";

// Définir le schéma
const taskSchema = new mongoose.Schema({
  title: { type: String, required: true },
  completed: { type: Boolean, default: false },
});

// Exporter le modèle
export default mongoose.model("Task", taskSchema)

Enter fullscreen mode Exit fullscreen mode

Étape 4 : Créer le contrôleur (Controller)

Dans le dossier controllers, créez un fichier taskController.js :

code javascript

import Task from "../models/Task");

// Afficher toutes les tâches depuis la base de donnée

export const getAllTasks = async (req, res) => {
  try {
    const tasks = await Task.find();
    res.render("index", { tasks });
  } catch (error) {
    res.status(500).send("Erreur lors de la récupération des tâches");
  }
};

Enter fullscreen mode Exit fullscreen mode

// Ajouter une nouvelle tâche
code Javascript

export const addTask = async (req, res) => {
  try {
    const { title } = req.body;
    await Task.create({ title });
    res.redirect("/");
  } catch (error) {
    res.status(500).send("Erreur lors de l'ajout de la tâche");
  }
};
Enter fullscreen mode Exit fullscreen mode

// Supprimer une tâche
code Javascript

export const deleteTask = async (req, res) => {
  try {
    const { id } = req.params;
    await Task.findByIdAndDelete(id);
    res.redirect("/");
  } catch (error) {
    res.status(500).send("Erreur lors de la suppression de la tâche");
  }
};
Enter fullscreen mode Exit fullscreen mode

Étape 5 : Créer la vue (View)

Dans le dossier views, créez un fichier index.ejs :

code html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Gestion des tâches</title>
</head>
<body>
  <h1>Liste des tâches</h1>

  <form action="/tasks" method="POST">
    <input type="text" name="title" placeholder="Ajouter une tâche" required />
    <button type="submit">Ajouter</button>
  </form>

  <ul>
    <% tasks.forEach(task => { %>
      <li>
        <%= task.title %> 
        <a href="/tasks/delete/<%= task._id %>">Supprimer</a>
      </li>
    <% }); %>
  </ul>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Étape 6 : Configurer Express (dans le fichier App.js)

Voici le contenu de app.js :

code javascript

import express from "express";
import mongoose from "mongoose"
import bodyParser from "body-parser";
import taskController from "./controllers");
import {getAllTasks, addTask, deleteTask } from "../controllers/taskController.js"

const app = express();

// Configuration de la base de données
mongoose
  .connect("mongodb://127.0.0.1:27017/mvc-tasks", 
{ 
  useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log("Connecté à MongoDB"))
  .catch((error) => console.log("Erreur de connexion à MongoDB :", error));

// Configuration de l'application
app.use(bodyParser.urlencoded({ extended: true }));
app.set("view engine", "ejs");

// Routes
app.get("/", getAllTasks);
app.post("/tasks", addTask);
app.get("/tasks/delete/:id", deleteTask);

// Démarrage du serveur
app.listen(3000, () => console.log("Serveur démarré sur http://localhost:3000"));

Enter fullscreen mode Exit fullscreen mode

Nous avons séparé les responsabilités de notre application :

Model : **Gestion des données (MongoDB).
**Controller : **Logique de l'application.
**View :
Interface utilisateur (EJS).

Cette structure rend votre code plus clair et plus facile à maintenir. Vous pouvez étendre cette application en ajoutant des fonctionnalités comme la modification des tâches ou la gestion des utilisateurs.

J'espère que vous avez aimé.. Des questions ? Mettez-les en commentaire.

express Article's
30 articles in total
Favicon
Cookies auto clearing after browser refresh issue , CORS related express cookies issue
Favicon
how to setup express api from scratch
Favicon
I Really like Middleware in NodeJs/Express.
Favicon
From Legacy to Lightning: Modernizing an Astro App with Daytona
Favicon
Setting Up Dual Compilation (SSR + CSR) in ViteJS with vite-plugin-builder
Favicon
Starting A Series On TypeScript Join In As We Build Together
Favicon
How to Generate a Secure JWT Secret Using Node.js
Favicon
Mastering Express.js: A Deep Dive
Favicon
Comprendre le Design Pattern MVC avec Node.js, Express et MongoDB
Favicon
How to implement File uploads in Nodejs: A step by step guide
Favicon
Node backend port band bo'lib qolishi
Favicon
Deploying an Existing Express API + Prisma + Supabase Project to Vercel
Favicon
New React Library: API Integration Made Easy with Axiosflow's Automatic Client Generation
Favicon
Build and Deploy a Monorepo WebSocket web application with Turbo, Express, and Vite on Render Using Docker
Favicon
Express app with decorators based routing and dependency injection
Favicon
miniframe-router: Router for Express.JS Applications
Favicon
Create an API for AG-Grid with Express
Favicon
Blogsphere | A blogging website made with MERN stack. includes user management.
Favicon
วิธีทำ Auth API ด้วย Express, JWT, MySQL และ Prisma
Favicon
[Boost]
Favicon
Complete, full-stack setup for any node/express/psql app, equipped with basic ui, routes & more.
Favicon
Which One Should You Choose NEST JS or EXPRESS JS?
Favicon
Hackers Love These Common MERN Stack Mistakes: Are You Exposing Your App? 🔐
Favicon
Build a React login page template
Favicon
A New Way of Setting Up an Express Server for Lazy Developers npm i mbfi
Favicon
[Boost]
Favicon
Express request types
Favicon
Mastering Express.js: A Deep Dive
Favicon
Getting Started with Express.js for Web Development
Favicon
Introduction to TypeScript with Express: Building Your First REST API

Featured ones: