Exercices — N09 Bases de Données
10 exercices pour maîtriser la persistance JSON, la classe JsonDB et son intégration avec Express.
Constructeur de la classe JsonDB
Créez une classe JsonDB avec un constructor(filename) qui stocke le chemin
du fichier dans this.filepath (utilisez path.join(__dirname, filename))
et initialise this.data en appelant this._load().
findAll() — Retourner tous les enregistrements
Ajoutez la méthode findAll() qui retourne
this.data.items (ou un tableau vide si la propriété n'existe pas).
Utilisez return this.data.items || [].
findById(id) — Chercher par ID
Ajoutez findById(id) qui utilise .find() pour retourner l'élément
dont l'ID correspond. Utilisez parseInt(id) pour la comparaison
(les IDs dans l'URL sont des strings).
insert(data) — Créer avec auto-increment
Ajoutez insert(item) qui : (1) calcule un ID auto-increment
(Math.max(...ids) + 1 ou 1 si vide),
(2) ajoute createdAt, (3) .push() dans le tableau,
(4) appelle this._save(), (5) retourne l'item créé.
update(id, data) — Fusionner et sauvegarder
Ajoutez update(id, data) qui : (1) trouve l'index avec findIndex(),
(2) retourne null si introuvable,
(3) fusionne avec spread { ...ancien, ...nouveau },
(4) appelle _save().
delete(id) — Filtrer et persister
Ajoutez delete(id) qui utilise .filter() pour créer un nouveau tableau
sans l'élément ciblé. Si la longueur n'a pas changé, retournez false.
Sinon sauvegardez avec _save() et retournez true.
_save() — Écrire sur le disque
Écrivez la méthode _save() qui utilise fs.writeFileSync()
pour écrire this.data sérialisé avec JSON.stringify(this.data, null, 2)
dans this.filepath. Le null, 2 ajoute une indentation lisible.
JsonDB + Express — Intégration complète
Instanciez JsonDB et créez une route
GET /articles avec Express qui retourne db.findAll() en JSON.
N'oubliez pas const db = new JsonDB('articles.json') avant les routes.
Pagination dans une route Express
Ajoutez la pagination à une route GET /articles :
lisez req.query.page et req.query.limit,
convertissez avec parseInt(), calculez
const start = (page - 1) * limit,
puis utilisez .slice(start, start + limit).
Gestion d'erreurs — try/catch pour les fichiers
Entourez les opérations fichier (readFileSync, writeFileSync)
d'un try/catch. Dans le catch de _load(),
retournez { items: [] } (tableau vide) plutôt que de faire planter le serveur.