Čo staviame
Kniha návštev: formulár v Reacte pošle správu na server, server ju uloží a ukáže každému budúcemu návštevníkovi. Pamätáš na formulár z Úrovne 2, ktorý nemal kam nič poslať? Dnes splatíme ten dlh.
Ukážem ti: backend knihy návštev
V priečinku my-server najprv nainštaluj ešte jeden balíček:
npm install cors
A uprav server.js:
const express = require("express");
const cors = require("cors");
const app = express();
app.use(cors()); // allow the frontend on a different port to ask questions
app.use(express.json()); // understand JSON in incoming requests
const messages = [
{ name: "Martin", text: "First message! Long live the guestbook. 📖" },
];
// GET – hand out messages
app.get("/api/messages", (request, response) => {
response.json(messages);
});
// POST – accept a new message
app.post("/api/messages", (request, response) => {
const { name, text } = request.body;
// Never trust input: check it on the server too!
if (!name || !text || name.length > 50 || text.length > 500) {
return response.status(400).json({ error: "Invalid message." });
}
messages.push({ name, text });
response.json({ saved: true });
});
app.listen(3900, () => {
console.log("Server running at http://localhost:3900");
});
Nové veci:
cors()– frontend beží na porte 3901, server na 3900. Prehliadače normálne blokujú takéto „cross-origin” požiadavky (bezpečnostné pravidlo CORS); takto to na serveri povolíš.app.post(...)– tvoj prvý POST endpoint! Dáta z formulára sú vrequest.body.- Kontrola na serveri – frontend už formulár kontroluje, ale útočník môže formulár obísť a poslať požiadavku priamo. Preto platí železné pravidlo: backend vždy kontroluje a nikdy neveruje frontendu.
status(400)znamená „zlá požiadavka.”
Ukážem ti: frontend knihy návštev
V React projekte vytvor src/GuestBook.jsx:
import { useState, useEffect } from 'react';
function GuestBook() {
const [messages, setMessages] = useState([]);
const [name, setName] = useState("");
const [text, setText] = useState("");
// On first render: download the messages from the server
useEffect(() => {
fetch("http://localhost:3900/api/messages")
.then((response) => response.json())
.then((data) => setMessages(data));
}, []);
function submit(event) {
event.preventDefault();
fetch("http://localhost:3900/api/messages", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name, text }),
})
.then((response) => response.json())
.then(() => {
setMessages([...messages, { name, text }]); // add it to the screen too
setName("");
setText("");
});
}
return (
<div>
<h2>Guestbook 📖</h2>
{messages.map((message, index) => (
<div className="card" key={index}>
<strong>{message.name}</strong>
<p>{message.text}</p>
</div>
))}
<form onSubmit={submit}>
<input
value={name}
onChange={(event) => setName(event.target.value)}
placeholder="Your name"
/>
<textarea
value={text}
onChange={(event) => setText(event.target.value)}
placeholder="Write a message..."
/>
<button type="submit">Send</button>
</form>
</div>
);
}
export default GuestBook;
Tri posledné nové veci v Reacte:
useEffect(() => {...}, [])– „spusti to raz, keď sa komponent prvýkrát zobrazí.” Ideálne miesto na stiahnutie dát.fetchsmethod: "POST"– posielame dáta;JSON.stringifyich zabalí do JSON.- Prepojené formuláre – pole číta hodnotu zo state (
value={name}) a pri písaní ju zapisuje späť (onChange). Formulár a state sú vždy synchronizované.
Teraz ty 💪
- Spusti oboje: server v jednom termináli (
node server.js), React v druhom (npm run dev -- --port 3901). Dva terminály, dva programy – vitaj vo full-stack! - Pridaj
<GuestBook />do aplikácie a vyskúšaj: napíš správu, obnov stránku – správa je stále tam (kým beží server). - Prispôsob knihu návštev projektu: 🏫 správy pre školu · 🙋 nástenka pre kamarátov · 🌍 tipy návštevníkov „kam ísť?” · ⚽ skandály fanúšikov.
- Skús poslať prázdnu správu – frontend ju pustí (nemá kontrolu), ale server ju odmietne. Potom pridaj kontrolu aj do frontendu, aby bol formulár slušný ako v Úrovni 2.
Správy zmiznú pri reštarte servera – žijú len v poli v pamäti. Skutočné aplikácie ich ukladajú do databázy, ktorá prežije všetko. To je prvá vec na naučenie po tejto úrovni – kľúčové slová: SQLite, PostgreSQL.
Skontroluj sa: Správa z formulára cestuje na server, uloží sa a po obnovení stránky sa vráti. Práve si postavil full-stack aplikáciu – frontend, backend, API. Presne to robia profesionálni vývojári každý deň.
Čo si z tejto lekcie odnášaš
useEffect(..., [])stiahne dáta pri prvom vykreslení;fetchs POST ich pošle.- Železné pravidlo bezpečnosti: server kontroluje každý vstup, aj keď kontroluje frontend.
- Full-stack = dva bežiace programy (3901 + 3900) rozprávajúce sa cez API.
© 2026 Ing. Martin Polak / AlgoRhino · Podmienky používania obsahu