L'architecture full-stack complète
Le chemin complet d’une donnée et les responsabilités.
Objectifs
À la fin de cette leçon, vous saurez :
- décrire le chemin complet d'une donnée, du clic à PostgreSQL et retour ;
- identifier la responsabilité de chaque couche ;
- comprendre pourquoi cette application « vanilla » est votre référence permanente.
🔗 Pour vous rafraîchir la mémoire : Pool pg et requêtes paramétrées ($1, $2) · CRUD en SQL · méthodes HTTP et codes de statut
Le schéma directeur
Navigateur Serveur Node PostgreSQL
┌───────────────┐ HTTP ┌──────────────────┐ SQL ┌────────────┐
│ HTML/CSS/JS │ ────────→ │ serveur http │ ──────→ │ tables │
│ fetch + DOM │ ←──────── │ + routage │ ←────── │ + index │
└───────────────┘ JSON │ + validation │ lignes └────────────┘
└──────────────────┘
Chaque flèche est un chapitre que vous avez déjà fait : TCP/HTTP pour le transport, JSON pour le format, requêtes paramétrées pour la base.
Suivre une création de tâche bout en bout
- L'utilisateur tape « Courses » et clique : événement JS (ch. 16).
fetch("/tasks", { method: "POST", body: ... }): le navigateur ouvre une connexion TCP (ch. 9) et envoie du HTTP (ch. 11).- Le serveur reçoit le flux (ch. 19), collecte le corps, valide.
pool.query("INSERT ...", [...]): le driver parle à PostgreSQL (ch. 22), contraintes vérifiées (ch. 20).RETURNING *renvoie la ligne ; le serveur répond201+ JSON.- Le frontend reçoit la Promise résolue (ch. 17), ajoute la ligne au DOM.
Six couches, zéro magie. Vous pouvez nommer chaque étape — c'est exactement l'objectif final du cursus (« expliquer entièrement le chemin »).
Qui sait quoi ? Les responsabilités
| Couche | Sait | Ne doit pas savoir |
|---|---|---|
| Frontend | afficher, saisir, appeler des URLs | le SQL, les règles métier profondes |
| API | valider, décider, orchestrer | comment le navigateur affiche |
| Base | stocker, garantir cohérence/perf | le sens métier des données |
La règle transversale : le serveur revalide tout. Le client peut être contourné avec curl ; la base ne voit que ce que l'API lui soumet. La validation vit donc aux trois étages, chacun selon ses moyens.
Pourquoi cette version vanilla est précieuse
Les prochains chapitres introduiront Express/NestJS (routing automatique), des ORM (SQL généré), Angular (DOM géré). Chacune de ces abstractions remplacera un mécanisme que vous venez d'écrire à la main :
- le routeur regex → décorateurs @Get/@Post ;
- db.js repository → ORM entities/repositories ;
- innerHTML render → templates déclaratifs.
Quand une abstraction échouera bizarrement, vous saurez remonter dessous : c'est le principe fondateur du cursus.
Exercice
- Récitez le chemin complet d'un DELETE depuis le clic jusqu'au disque.
- Où se situe la validation du titre ≤ 200 caractères dans chaque couche ?
- Que perd-on si on supprime la couche repository ?
Résumé
- Navigateur → HTTP → Node → SQL → PostgreSQL → retour : le circuit complet maîtrisé.
- Trois couches, trois responsabilités ; validation redondante par sécurité.
- L'app vanilla = carte de référence de toutes les abstractions futures.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 1. Clic → handler confirm() → fetch DELETE /tasks/12 → TCP vers :3000 → routeur matche DELETE + id=12 → DELETE FROM tasks WHERE id=$1 RETURNING id → ligne absente ? 404. Présente ? 204 sans corps → frontend retire la ligne du DOM.
Question 2. Frontend : maxlength + message immédiat. API : contrôle longueur/type avant INSERT. Base : contrainte CHECK (length(titre) <= 200) possible en dernier rempart. Trois défenses indépendantes.
Question 3. Le SQL se répand dans le routeur : duplication, tests impossibles sans vraie base, migration douloureuse. Le repository est peu coûteux à écrire et paie dès le premier test.