Bài học hiện đang bằng tiếng Séc. Giao diện đã được dịch – nội dung bài học sẽ sớm có.

← Cấp 4 – Chuyên gia dữ liệu

Bài 5 / 6 ⏱ 55 phút Premium

Sổ lưu bút tồn tại mãi mãi

Viết lại API để tin nhắn sống trong SQLite. Khởi động lại server sẽ không xóa gì nữa.

Chúng ta đang xây gì

Cùng API như ở Cấp 3 – GET /api/vzkazyPOST /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 idvytvoreno. 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 💪

  1. Thay mảng vzkazy trong server.js bằng code trên (hoặc làm từng bước – GET trước, rồi POST).
  2. Khởi động server và gửi 2 tin nhắn từ React.
  3. Dừng server, khởi động lại, làm mới trang – tin nhắn phải còn.
  4. 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ờiweb.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ớ