Exercices — N09 Bases de Données

10 exercices pour maîtriser la persistance JSON, la classe JsonDB et son intégration avec Express.

EX1

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().

EX2

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 || [].

EX3

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).

EX4

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éé.

EX5

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().

EX6

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.

EX7

_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.

EX8

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.

EX9

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).

EX10

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.

← Cours Mini-projet →