← Nivel 4 – Data pro

Lección 5 de 6 ⏱ 55 minutos Premium

Un libro de visitas que dura para siempre

Reescribe la API para que los mensajes vivan en SQLite. Un reinicio del servidor ya no borrará nada.

Qué vamos a construir

La misma API que en el Nivel 3 – GET /api/vzkazy y POST /api/vzkazy – pero en lugar de un array en memoria, leemos y escribimos en SQLite. El frontend en React puede quedarse casi igual.

Te lo muestro: un servidor con base de datos

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");
});

Te lo muestro: el frontend

El componente React del Nivel 3 funciona sin cambios – el servidor devuelve el mismo JSON, solo con campos extra id y vytvoreno. Puedes mostrarlos debajo del mensaje en texto gris pequeño.

Ahora tú 💪

  1. Sustituye el array vzkazy en server.js por el código de arriba (o hazlo poco a poco – primero GET, luego POST).
  2. Arranca el servidor y envía 2 mensajes desde React.
  3. Para el servidor, arráncalo otra vez, actualiza la página – los mensajes deben seguir ahí.
  4. Haz commit de los cambios en Git y push a GitHub (sin web.db – está en .gitignore).
⚠️

En Render/Railway, el disco a veces es temporalweb.db puede borrarse tras un nuevo despliegue. En producción, usa más adelante una base de datos alojada (Render ofrece PostgreSQL gratis). Para aprender y localhost, SQLite es perfecto.

Compruébalo: El libro de visitas sobrevive a un reinicio. La validación ocurre en el servidor. Usas SQL parametrizado.

Lo que te llevas de esta lección