Level 26 (Challenge): Persist to Disk
- Write your in-memory data out to a JSON file after each create.
- On server start, load the file back in so data survives restarts.
- Important: Name your JSON file after your resource (e.g.,
books.json, courses.json), not items.json.
- Hint: Replace your fake data array (like
const itemsStorage = [...]) with data loaded from the JSON file. Read from the file once when the server starts, then call saveItems() after each change (POST, PUT, DELETE) in your routes.
Show Me: read from disk
import { readFileSync, writeFileSync } from 'node:fs';
const DATA_PATH = './items.json';
// Load data from file when server starts
// If file doesn't exist yet, start with empty array
let itemsStorage = [];
try {
itemsStorage = JSON.parse(readFileSync(DATA_PATH, 'utf-8'));
} catch (error) {
// File doesn't exist yet, start with empty array
itemsStorage = [];
}
Show Me: persist to disk
import { readFileSync, writeFileSync } from 'node:fs';
const DATA_PATH = './items.json';
// Load data from file when server starts (read once at startup)
// If file doesn't exist yet, start with empty array
let itemsStorage = [];
try {
itemsStorage = JSON.parse(readFileSync(DATA_PATH, 'utf-8'));
} catch (error) {
// File doesn't exist yet, start with empty array
itemsStorage = [];
}
function saveItems() {
writeFileSync(DATA_PATH, JSON.stringify(itemsStorage, null, 2));
}
// Use in your routes - call saveItems() after each change:
app.post('/items', (req, res) => {
itemsStorage.push(req.body);
saveItems(); // Write after each POST
res.json(req.body);
});
app.put('/items/:id', (req, res) => {
// ... update logic ...
saveItems(); // Write after each PUT
res.json(updatedItem);
});
app.delete('/items/:id', (req, res) => {
// ... delete logic ...
saveItems(); // Write after each DELETE
res.json({ message: 'Deleted' });
});