Chúng ta đang xây gì
Cùng API như ở Cấp 3 – GET /api/vzkazy và POST /api/vzkazy – nhưng thay vì mảng trong bộ nhớ, chúng ta đọc và ghi vào SQLite. Frontend React gần như giữ nguyên.
Xem thử: server với cơ sở dữ liệu
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");
});
Xem thử: frontend
Component React từ Cấp 3 hoạt động không cần sửa – server trả về cùng JSON, chỉ thêm trường id và vytvoreno. Bạn có thể hiển thị chúng dưới tin nhắn bằng chữ xám nhỏ.
Đến lượt bạn 💪
- Thay mảng
vzkazytrongserver.jsbằng code trên (hoặc làm từng bước – GET trước, rồi POST). - Khởi động server và gửi 2 tin nhắn từ React.
- Dừng server, khởi động lại, làm mới trang – tin nhắn phải còn.
- Commit thay đổi vào Git và push lên GitHub (không có
web.db– nó nằm trong.gitignore).
Trên Render/Railway, ổ đĩa đôi khi tạm thời – web.db có thể bị xóa sau redeploy. Trong production, sau này dùng cơ sở dữ liệu hosted (Render có PostgreSQL miễn phí). Để học và localhost, SQLite hoàn hảo.
Kiểm tra: Sổ lưu bút sống sót sau khi khởi động lại. Validation chạy trên server. Bạn dùng SQL tham số hóa.
Những điều cần nhớ
- API + SQLite = dữ liệu vĩnh viễn.
prepare+?cho INSERT an toàn.web.dbkhông thuộc về Git; sau này dùng PostgreSQL trên đám mây.
© 2026 Ing. Martin Polak / AlgoRhino · Điều khoản sử dụng nội dung