← Úroveň 3 – Mistr

Lekce 9 z 10 ⏱ 60 minut

Návštěvní kniha: frontend a backend spolu

Velký okamžik: propojíš React se svým serverem. Vzkazy se konečně budou opravdu ukládat.

Co stavíme

Návštěvní knihu: formulář v Reactu pošle vzkaz na tvůj server, server si ho uloží a všem dalším návštěvníkům ho ukáže. Pamatuješ na formulář z Úrovně 2, který neměl kam posílat? Dnes svůj dluh splatíme.

Ukaž mi to: backend návštěvní knihy

Ve složce muj-server nejdřív doinstaluj jeden balíček:

npm install cors

A uprav server.js:

const express = require("express");
const cors = require("cors");
const aplikace = express();

aplikace.use(cors());           // dovol frontendu z jiného portu se ptát
aplikace.use(express.json());   // rozuměj JSONu v příchozích požadavcích

const vzkazy = [
  { jmeno: "Martin", text: "První vzkaz! Ať kniha slouží. 📖" },
];

// GET – rozdávej vzkazy
aplikace.get("/api/vzkazy", (pozadavek, odpoved) => {
  odpoved.json(vzkazy);
});

// POST – přijmi nový vzkaz
aplikace.post("/api/vzkazy", (pozadavek, odpoved) => {
  const { jmeno, text } = pozadavek.body;

  // Nikdy nevěř vstupu: zkontroluj i na serveru!
  if (!jmeno || !text || jmeno.length > 50 || text.length > 500) {
    return odpoved.status(400).json({ chyba: "Neplatný vzkaz." });
  }

  vzkazy.push({ jmeno, text });
  odpoved.json({ ulozeno: true });
});

aplikace.listen(3900, () => {
  console.log("Server běží na http://localhost:3900");
});

Novinky:

Ukaž mi to: frontend návštěvní knihy

V React projektu vytvoř src/NavstevniKniha.jsx:

import { useState, useEffect } from 'react';

function NavstevniKniha() {
  const [vzkazy, setVzkazy] = useState([]);
  const [jmeno, setJmeno] = useState("");
  const [text, setText] = useState("");

  // Při prvním zobrazení: stáhni vzkazy ze serveru
  useEffect(() => {
    fetch("http://localhost:3900/api/vzkazy")
      .then((odpoved) => odpoved.json())
      .then((data) => setVzkazy(data));
  }, []);

  function odesli(udalost) {
    udalost.preventDefault();

    fetch("http://localhost:3900/api/vzkazy", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ jmeno, text }),
    })
      .then((odpoved) => odpoved.json())
      .then(() => {
        setVzkazy([...vzkazy, { jmeno, text }]);  // přidej i na obrazovku
        setJmeno("");
        setText("");
      });
  }

  return (
    <div>
      <h2>Návštěvní kniha 📖</h2>

      {vzkazy.map((vzkaz, poradi) => (
        <div className="karta" key={poradi}>
          <strong>{vzkaz.jmeno}</strong>
          <p>{vzkaz.text}</p>
        </div>
      ))}

      <form onSubmit={odesli}>
        <input
          value={jmeno}
          onChange={(udalost) => setJmeno(udalost.target.value)}
          placeholder="Tvoje jméno"
        />
        <textarea
          value={text}
          onChange={(udalost) => setText(udalost.target.value)}
          placeholder="Napiš vzkaz…"
        />
        <button type="submit">Odeslat</button>
      </form>
    </div>
  );
}

export default NavstevniKniha;

Tři poslední novinky Reactu:

Teď ty 💪

  1. Rozjeď obojí: v jednom terminálu server (node server.js), ve druhém React (npm run dev -- --port 3901). Dva terminály, dva programy – vítej ve full-stacku!
  2. Zapoj <NavstevniKniha /> do své aplikace a vyzkoušej: napiš vzkaz, obnov stránku – vzkaz tam pořád je (dokud běží server).
  3. Přizpůsob knihu projektu: 🏫 vzkazy pro školu · 🙋 vzkazník pro kamarády · 🌍 „kam máme vyrazit?” tipy od návštěvníků · ⚽ pokřiky fanoušků.
  4. Zkus poslat prázdný vzkaz – frontend ho pustí (nemá kontrolu), ale server ho odmítne. Pak přidej kontrolu i do frontendu, ať je formulář slušný jako v Úrovni 2.
💡

Vzkazy po restartu serveru zmizí – bydlí jen v poli v paměti. Opravdové aplikace je ukládají do databáze, která přežije cokoli. To je první věc, kterou se nauč, až dokončíš tuhle úroveň – klíčová slova: SQLite, PostgreSQL.

Kontrola: Vzkaz z formuláře docestuje do serveru, uloží se a po obnovení stránky se vrátí. Právě jsi postavil(a) full-stack aplikaci – frontend, backend, API. Tohle je přesně to, co dělají profesionální vývojáři každý den.

Co si z téhle lekce odnést