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.

mongodb Article's
30 articles in total
Favicon
🌐 Building Golang RESTful API with Gin, MongoDB 🌱
Favicon
Construindo uma API segura e eficiente com @fastify/jwt e @fastify/mongodb
Favicon
Making a Todo API with FastAPI and MongoDB
Favicon
How to Create and Consume a REST API in Next.js
Favicon
Crudify: Automate Your Mongoose CRUD Operations in NestJS
Favicon
Utilizando la librería Mongoose
Favicon
Full Stack Development (Mern && Flutter)
Favicon
Node.js Meets PostgreSQL and MongoDB in Docker: Docker Diaries
Favicon
Comprendre le Design Pattern MVC avec Node.js, Express et MongoDB
Favicon
Set up MongoDB primary and secondary with Docker.
Favicon
The Intricacies of MongoDB Aggregation Pipeline: Challenges and Insights from Implementing It with Go
Favicon
Test Post
Favicon
Containerizing a MERN Stack Application!
Favicon
MongoDB vs. Couchbase: Comparing Mobile Database Features
Favicon
6 Steps to Set Up MongoDB Atlas for Node.js Applications
Favicon
MongoDB: How to setup replica sets
Favicon
To Dockerize a Node.js and MongoDB CRUD app
Favicon
Day 39: Deploying Stateful Applications with StatefulSets (MongoDB)
Favicon
Do you think schema flexibility justifies using NoSQL? Think twice.
Favicon
HadiDB: A Lightweight, Horizontally Scalable Database in Python
Favicon
A Simple Guide for Choosing the Right Database
Favicon
Integrating MongoDB Atlas Alerts with Lark Custom Bot via AWS Lambda
Favicon
🔍 MongoDB Data Modeling: Embedding vs. Referencing - A Strategic Choice!
Favicon
Unique Index on NULL Values in SQL & NoSQL
Favicon
Embedding vs. Referencing - A Strategic Choice!
Favicon
Series de tiempo en MongoDB
Favicon
I want to write a code for POS sales output interface - and import to mongoDb for sale analysis- however is POS agnostic interface, should work with all POS
Favicon
Hello,help review my fullstack website stack : nestjs,mongodb and reactjs. https://events-org-siiv.vercel.app/
Favicon
Implementing an Express-based REST API in TypeScript with MongoDB, JWT-based Authentication, and RBAC
Favicon
It's a Security Thing.

Featured ones: