Wat we bouwen
Dezelfde API als in Level 3 – GET /api/vzkazy en POST /api/vzkazy – maar in plaats van een array in geheugen lezen en schrijven we naar SQLite. De React-frontend kan bijna hetzelfde blijven.
Ik laat je zien: een server met database
const express = require("express");
const cors = require("cors");
const Database = require("better-sqlite3");
const aplikace = express();
const db = new Database("web.db");
db.exec(`
CREATE TABLE IF NOT EXISTS vzkazy (
id INTEGER PRIMARY KEY AUTOINCREMENT,
jmeno TEXT NOT NULL,
text TEXT NOT NULL,
vytvoreno TEXT DEFAULT CURRENT_TIMESTAMP
)
`);
aplikace.use(cors());
aplikace.use(express.json());
// GET – all messages from the database
aplikace.get("/api/vzkazy", (pozadavek, odpoved) => {
const radky = db.prepare(
"SELECT id, jmeno, text, vytvoreno FROM vzkazy ORDER BY id DESC"
).all();
odpoved.json(radky);
});
// POST – a new message into the database
aplikace.post("/api/vzkazy", (pozadavek, odpoved) => {
const { jmeno, text } = pozadavek.body;
if (!jmeno || !text || jmeno.length > 50 || text.length > 500) {
return odpoved.status(400).json({ chyba: "Invalid message." });
}
const vloz = db.prepare("INSERT INTO vzkazy (jmeno, text) VALUES (?, ?)");
const vysledek = vloz.run(jmeno, text);
odpoved.json({ ulozeno: true, id: vysledek.lastInsertRowid });
});
aplikace.listen(3900, () => {
console.log("Server running at http://localhost:3900");
});
Ik laat je zien: de frontend
De React-component uit Level 3 werkt zonder wijzigingen – de server geeft dezelfde JSON terug, alleen met extra velden id en vytvoreno. Je kunt ze onder het bericht in klein grijs tonen.
Nu jij 💪
- Vervang de
vzkazy-array inserver.jsdoor de code hierboven (of stap voor stap – eerst GET, dan POST). - Start de server en stuur 2 berichten vanuit React.
- Stop de server, start opnieuw, ververs de pagina – de berichten moeten blijven.
- Commit de wijzigingen naar Git en push naar GitHub (zonder
web.db– die staat in.gitignore).
Op Render/Railway is de schijf soms tijdelijk – web.db kan na een redeploy verdwijnen. In productie gebruik je later een gehoste database (Render biedt gratis PostgreSQL). Voor leren en localhost is SQLite perfect.
Controle: Het gastenboek overleeft een herstart. Validatie gebeurt op de server. Je gebruikt geparametriseerde SQL.
Wat neem je mee uit deze les
- API + SQLite = permanente data.
prepare+?voor veilige INSERTs.web.dbhoort niet in Git; gebruik later PostgreSQL in de cloud.
© 2026 Ing. Martin Polak / AlgoRhino · Contentgebruiksvoorwaarden