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.
Ce découpage est aussi votre carte de diagnostic : quand « ça ne marche pas », la couche défaillante se localise par ses symptômes propres :
rien dans le réseau DevTools → le frontend n'a pas appelé (bug JS)
requête rouge 4xx dans le réseau → l'API a refusé : lire le corps de réponse
requête 5xx → l'API a planté : lire SES logs
API lente sur une route précise → suspect n°1 : la requête SQL (EXPLAIN)
Chaque étage a ses outils d'inspection (DevTools / curl -v / logs / psql) — vous les avez tous appris ; il ne reste qu'à les associer à leur étage.
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.