TW3 — Technologies du Web 3

Architecture MVC

Séparation des responsabilités en Modèle, Vue et Contrôleur, et application concrète du pattern MVC dans une API Express avec une arborescence routes/controllers/models/services.

Le pattern MVC (Model – View – Controller) est une façon de découper une application pour que chaque partie ait un rôle unique et prévisible. On l'utilise autant pour les interfaces graphiques que pour les API, avec une « vue » qui renvoie du JSON plutôt que du HTML.

🧩 Les trois responsabilités

  • Modèle : données + règles métier. Il sait comment lire, valider et manipuler les informations.
  • Vue : représentation envoyée au client. Dans une API, c'est le JSON de la réponse.
  • Contrôleur : point d'entrée HTTP. Il reçoit la requête, délègue au modèle, et forme la réponse.

En API, la « Vue » est souvent minimale : le contrôleur renvoie directement un objet sérialisé en JSON. Le découpage Modèle / Contrôleur reste le plus important.

🔄 Le cycle d'une requête

  1. Le routeur reçoit GET /articles/42.
  2. Il appelle le contrôleur getArticle(req, res).
  3. Le contrôleur demande au modèle Article.findById(42).
  4. Le modèle interroge la base et renvoie un objet.
  5. Le contrôleur renvoie l'objet en JSON (la vue).
// controllers/articleController.js
import { Article } from "../models/article.js"

export async function getArticle(req, res) {
  const article = await Article.findById(req.params.id)
  if (!article) return res.status(404).json({ error: "Introuvable" })
  res.json(article)
}

🗂️ Arborescence recommandée

Une structure en dossiers évite les fichiers « Dieu » qui mélangent tout.

src/
├── routes/
│   └── articles.js        # déclare les endpoints
├── controllers/
│   └── articleController.js  # logique HTTP (req/res)
├── services/
│   └── articleService.js     # logique métier réutilisable
├── models/
│   └── article.js         # accès aux données
└── index.js               # configuration Express

Les routes ne font que brancher les URLs aux contrôleurs. La logique va dans les contrôleurs, l'accès aux données dans les modèles.

🔌 Brancher le tout avec Express

Le routeur fait le lien entre l'URL et le contrôleur, sans contenir de logique.

// routes/articles.js
import { Router } from "express"
import { getArticle, listArticles } from "../controllers/articleController.js"

const router = Router()
router.get("/", listArticles)
router.get("/:id", getArticle)

export default router
// index.js
import express from "express"
import articlesRouter from "./routes/articles.js"

const app = express()
app.use(express.json())
app.use("/articles", articlesRouter)
app.listen(3000)

🧠 Modèle vs Contrôleur vs Service

  • Le contrôleur parle HTTP : il lit req.params, écrit res.status(...).
  • Le service porte la logique métier (calculs, règles) et est réutilisable ailleurs.
  • Le modèle porte l'accès aux données (requêtes, ORM).

Dès qu'un contrôleur commence à contenir des requêtes SQL ou des règles métier complexes, extrayez-les dans un service ou un modèle. Gardez les contrôleurs fins.

➡️ Suite

La page La couche modèle détaille comment bien écrire le modèle et ses validations.

Quiz du chapitre

5 questions
0 / 5 répondue0%
  1. 1Dans une API MVC, quel dossier doit contenir la logique HTTP (lecture de req, écriture de res) ?
  2. 2Quel est le rôle typique du dossier routes/ ?
  3. 3Où place-t-on l'accès aux données (requêtes, ORM) ?
  4. 4Pourquoi une couche service est-elle utile ?
  5. 5Dans une API, que représente la « Vue » du MVC ?
Répondez à toutes les questions pour valider.

MVC & ORM

Terminez le quiz du chapitre pour le marquer comme complété.

Tableau de bord

On this page