# Vytvorte bankovú aplikáciu časť 3: Spôsoby získavania a používania dát Predstavte si počítač Enterprise zo Star Treku – keď kapitán Picard žiada o stav lode, informácie sa zobrazia okamžite bez toho, aby sa celé rozhranie zastavilo a znovu zostavovalo. Tento plynulý tok informácií je presne to, čo tu vytvárame s dynamickým získavaním dát. Váš bankový app je momentálne ako vytlačená novina – informatívna, ale statická. Premeníme ju na niečo viac ako riadiace centrum NASA, kde dáta tečú nepretržite a aktualizujú sa v reálnom čase bez prerušenia pracovného toku používateľa. Naučíte sa, ako asynchrónne komunikovať so servermi, spracovávať dáta, ktoré prichádzajú v rôznom čase, a premieňať surové informácie na zmysluplný obsah pre vašich používateľov. Toto je rozdiel medzi demom a softvérom pripraveným na produkciu. ## ⚡ Čo zvládnete za ďalších 5 minút **Rýchla cesta pre zaneprázdnených vývojárov** ```mermaid flowchart LR A[⚡ 5 minút] --> B[Nastaviť API server] B --> C[Testovať získavanie dát cez curl] C --> D[Vytvoriť prihlasovaciu funkciu] D --> E[Zobraziť dáta v akcii] ``` - **Minúty 1-2**: Spustite svoj API server (`cd api && npm start`) a otestujte pripojenie - **Minúta 3**: Vytvorte základnú funkciu `getAccount()` používajúcu fetch - **Minúta 4**: Prepojte prihlasovací formulár s `action="javascript:login()"` - **Minúta 5**: Otestujte prihlásenie a sledujte, ako sa dáta o účte zobrazia v konzole **Rýchle testovacie príkazy**: ```bash # Overiť, či API beží curl http://localhost:5000/api # Test načítania údajov účtu curl http://localhost:5000/api/accounts/test ``` **Prečo je to dôležité**: Za 5 minút uvidíte čaro asynchrónneho získavania dát, ktoré poháňa každú modernú webovú aplikáciu. Toto je základ, ktorý robí aplikácie rýchle a živé. ## 🗺️ Vaša cesta učenia sa cez dátovo riadené webové aplikácie ```mermaid journey title Od statických stránok k dynamickým aplikáciám section Pochopenie vývoja Tradičné obnovovanie stránok: 3: You Objavte výhody AJAX/SPA: 5: You Ovládnite vzory Fetch API: 7: You section Budovanie autentifikácie Vytvorte prihlasovacie funkcie: 4: You Riešte asynchrónne operácie: 6: You Spravujte používateľské relácie: 8: You section Dynamické aktualizácie UI Naučte sa manipuláciu s DOM: 5: You Vytvorte zobrazenia transakcií: 7: You Vytvorte responzívne dashboardy: 9: You section Profesionálne vzory Renderovanie na základe šablón: 6: You Stratégiá spracovania chýb: 7: You Optimalizácia výkonu: 8: You ``` **Cieľ vašej cesty**: Na konci tejto lekcie budete rozumieť, ako moderné webové aplikácie získavajú, spracovávajú a dynamicky zobrazujú dáta, čím vytvárajú plynulé používateľské zážitky, ktoré očakávame od profesionálnych aplikácií. ## Pre-učebný kvíz [Pre-učebný kvíz](https://ff-quizzes.netlify.app/web/quiz/45) ### Predpoklady Pred tým, než začnete so získavaním dát, uistite sa, že máte pripravené tieto komponenty: - **Predchádzajúca lekcia**: Dokončite [Formulár prihlásenia a registrácie](../2-forms/README.md) – na tomto základe budeme stavať - **Lokálny server**: Nainštalujte [Node.js](https://nodejs.org) a [spustite API server](../api/README.md), ktorý poskytne dáta o účtoch - **Pripojenie k API**: Otestujte svoje pripojenie k serveru pomocou tohto príkazu: ```bash curl http://localhost:5000/api # Očakávaná odpoveď: "Bank API v1.0.0" ``` Tento rýchly test zabezpečuje, že všetky komponenty správne komunikujú: - Overuje správnu funkčnosť Node.js na vašom systéme - Potvrdzuje, že váš API server je aktívny a odpovedá - Validuje, že vaša aplikácia vie dosiahnuť server (ako kontrola rádiového spojenia pred misiou) ## 🧠 Prehľad ekosystému správy dát ```mermaid mindmap root((Správa údajov)) Authentication Flow Login Process Overenie formulára Overenie poverení Správa relácie User State Globálny účet objekt Navigačné stráže Riešenie chýb API Communication Fetch Patterns GET požiadavky POST požiadavky Chybové odpovede Data Formats Spracovanie JSON Kódovanie URL Parsovanie odpovede Dynamic UI Updates DOM Manipulation Bezpečné aktualizácie textu Vytváranie prvkov Klonovanie šablón User Experience Aktualizácie v reálnom čase Chybové správy Stav načítania Security Considerations XSS Prevention Použitie textContent Sanitizácia vstupu Bezpečné vytváranie HTML CORS Handling Požiadavky medzi pôvodmi Konfigurácia hlavičiek Vývojové nastavenie ``` **Základný princíp**: Moderné webové aplikácie sú systémy na orchestráciu dát – koordinujú medzi používateľským rozhraním, serverovými API a bezpečnostnými modelmi prehliadača, aby vytvorili plynulé, responzívne zážitky. --- ## Pochopenie získavania dát v moderných webových aplikáciách Spôsob, akým webové aplikácie spracovávajú dáta, sa v posledných dvoch desaťročiach dramaticky vyvinul. Pochopenie tejto evolúcie vám pomôže oceniť, prečo sú moderné techniky ako AJAX a Fetch API také silné a prečo sa stali nevyhnutnými nástrojmi pre webových vývojárov. Pozrime sa, ako tradičné weby fungovali oproti dynamickým, responzívnym aplikáciám, ktoré dnes vytvárame. ### Tradičné viacstránkové aplikácie (MPA) Začiatky webu boli ako prepínanie kanálov na starom televízore – obrazovka zhasla a potom sa pomaly načítal nový obsah. Takto v skutočnosti fungovali prvé webové aplikácie, kde každá interakcia znamenala kompletne prekresliť celú stránku od základu. ```mermaid sequenceDiagram participant User participant Browser participant Server User->>Browser: Klikne na odkaz alebo odošle formulár Browser->>Server: Požiada o novú HTML stránku Note over Browser: Stránka sa vyprázdni Server->>Browser: Vráti kompletnú HTML stránku Browser->>User: Zobrazí novú stránku (bliknutie/obnovenie) ``` ![Pracovný postup aktualizácie vo viacstránkovej aplikácii](../../../../translated_images/sk/mpa.7f7375a1a2d4aa77.webp) **Prečo tento prístup pôsobil neohrabane:** - Každým kliknutím sa celé znovu načítavala stránka - Používatelia boli rušení blikajúcimi stránkami uprostred myšlienky - Vaše internetové pripojenie pracovalo na plné obrátky pri sťahovaní rovnakých hlavičiek a pätičiek - Aplikácie pôsobili skôr ako preklikávanie skrinky na spisy než ako skutočný softvér ### Moderné jednostránkové aplikácie (SPA) AJAX (Asynchronous JavaScript and XML) úplne zmenil túto paradigmu. Ako modulárna stavba Medzinárodnej vesmírnej stanice, kde astronauti môžu meniť jednotlivé časti bez prestavby celého komplexu, AJAX nám umožňuje aktualizovať iba konkrétne časti stránky bez znovunačítania všetkého. Napriek názvu, ktorý spomína XML, dnes využívame prevažne JSON, no základný princíp zostáva: aktualizovať len to, čo je potrebné. ```mermaid sequenceDiagram participant User participant Browser participant JavaScript participant Server User->>Browser: Interaguje so stránkou Browser->>JavaScript: Spúšťa obsluhu udalosti JavaScript->>Server: Načíta len potrebné údaje Server->>JavaScript: Vracia JSON údaje JavaScript->>Browser: Aktualizuje konkrétne prvky stránky Browser->>User: Zobrazuje aktualizovaný obsah (bez obnovenia) ``` ![Pracovný postup aktualizácie v jednostránkovej aplikácii](../../../../translated_images/sk/spa.268ec73b41f992c2.webp) **Prečo sa SPA cítia omnoho lepšie:** - Aktualizujú sa len zmenené časti (šikovné, však?) - Žiadne nepríjemné prerušovania – používatelia zostávajú vo svojom pracovnom toku - Menej dát cez sieť znamená rýchlejšie načítavanie - Všetko pôsobí rýchlo a responzívne, ako aplikácie na vašom telefóne ### Vývoj k modernému Fetch API Moderné prehliadače poskytujú [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API), ktoré nahrádza staršie [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest). Ako rozdiel medzi telegrafom a emailom, Fetch API používa promises pre čistejší asynchrónny kód a prirodzene pracuje s JSON. | Funkcia | XMLHttpRequest | Fetch API | |---------|----------------|----------| | **Syntax** | Zložitý callbackový | Čistý založený na promises | | **Spracovanie JSON** | Vyžaduje manuálne parsovanie | Vstavaná metóda `.json()` | | **Spracovanie chýb** | Obmedzené informácie o chybách | Komplexné detaily o chybách | | **Moderná podpora** | Kompatibilita so starším kódom | ES6+ promises a async/await | > 💡 **Kompatibilita prehliadačov**: Dobrá správa – Fetch API funguje vo všetkých moderných prehliadačoch! Ak vás zaujímajú konkrétne verzie, [caniuse.com](https://caniuse.com/fetch) má kompletný prehľad. > **Zhrnutie:** - Funguje skvele v Chrome, Firefox, Safari a Edge (v podstate všade, kde sú vaši používatelia) - Iba Internet Explorer vyžaduje dodatočnú podporu (a úprimne, je načase sa IE rozlúčiť) - Položí základ pre elegantný async/await vzor, ktorý použijeme neskôr ### Implementácia prihlasovania používateľa a získavania dát Teraz implementujme prihlasovací systém, ktorý premení vašu bankovú aplikáciu zo statickej zobrazenia na funkčnú aplikáciu. Ako autentifikačné protokoly v bezpečných vojenských zariadeniach, overíme prihlasovacie údaje a následne poskytneme prístup k špecifickým dátam používateľa. Budeme to stavať postupne, začneme základnou autentifikáciou a potom pridáme funkcie získavania dát. #### Krok 1: Vytvorenie základu prihlasovacej funkcie Otvorte svoj súbor `app.js` a pridajte novú funkciu `login`. Tá bude riešiť proces autentifikácie používateľa: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; } ``` **Pozrime sa na to podrobnejšie:** - Ten kľúčový slovný výraz `async`? Hovorí JavaScriptu „hej, táto funkcia možno bude musieť čakať na niečo“ - Odcvičíme náš formulár zo stránky (nič zložité, len ho nájdeme podľa ID) - Potom získame, čo používateľ zadal ako svoje používateľské meno - Tu je šikovný trik: môžete pristupovať k akýmkoľvek vstupom formulára podľa ich atribútu `name` – nie je potrebné volať getElementById navyše! > 💡 **Prístup k formuláru**: Ku každému ovládaciemu prvku formulára sa dá pristupovať podľa jeho name (nastaveného v HTML cez atribút `name`) ako k vlastnosti formulárového elementu. Poskytuje to čistý a prehľadný spôsob získavania dát z formulára. #### Krok 2: Vytvorenie funkcie na získavanie dát účtu Ďalej vytvoríme samostatnú funkciu na získavanie dát o účte zo servera. Nasleduje rovnaký vzor ako funkcionalita registrácie, ale zameraná na získavanie dát: ```javascript async function getAccount(user) { try { const response = await fetch('//localhost:5000/api/accounts/' + encodeURIComponent(user)); return await response.json(); } catch (error) { return { error: error.message || 'Unknown error' }; } } ``` **Čo tento kód dosahuje:** - **Používa** moderné `fetch` API na asynchrónne získavanie dát - **Stavia** URL pre GET požiadavku s parametrom používateľského mena - **Používa** `encodeURIComponent()` na bezpečné spracovanie špeciálnych znakov v URL - **Konvertuje** odpoveď do formátu JSON pre jednoduchú manipuláciu s dátami - **Ovláda** chyby elegantne, vracia objekt s chybou namiesto pádu aplikácie > ⚠️ **Bezpečnostná poznámka**: Funkcia `encodeURIComponent()` spracováva špeciálne znaky v URL. Ako kódovacie systémy používané v námornej komunikácii, zabezpečuje, že vaša správa dorazí presne tak, ako má, a zabraňuje nesprávnej interpretácii znakov ako "#" alebo "&". > **Prečo je to dôležité:** - Zabráni tomu, aby špeciálne znaky rozbili URL - Chráni pred útokmi na manipuláciu s URL - Zabezpečuje, že server prijme správne dáta - Dodržiava bezpečnostné programátorské postupy #### Pochopenie HTTP GET požiadaviek Možno vás prekvapí, že keď použijete `fetch` bez ďalších nastavení, automaticky sa vytvorí [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) požiadavka. To je ideálne pre to, čo robíme – pýtame sa servera „hej, môžem vidieť dáta účtu tohto používateľa?“ Predstavte si GET požiadavku ako zdvorilé požičanie knihy z knižnice – žiadate o zobrazenie niečoho, čo už existuje. POST požiadavky (ktoré sme použili pri registrácii) sú viac ako vloženie novej knihy do zbierky. | GET požiadavka | POST požiadavka | |----------------|-----------------| | **Účel** | Získať existujúce dáta | Poslať nové dáta na server | | **Parametre** | V URL ceste alebo dotaze | V tele požiadavky | | **Cacheovanie** | Môže byť cacheované prehliadačom | Obvykle sa necacheuje | | **Bezpečnosť** | Viditeľné v URL a logoch | Skryté v tele požiadavky | ```mermaid sequenceDiagram participant B as Prehliadač participant S as Server Note over B,S: GET požiadavka (Získavanie dát) B->>S: GET /api/accounts/test S-->>B: 200 OK + Údaje o účte Note over B,S: POST požiadavka (Odoslanie dát) B->>S: POST /api/accounts + Nové údaje o účte S-->>B: 201 Vytvorené + Potvrdenie Note over B,S: Spracovanie chýb B->>S: GET /api/accounts/nonexistent S-->>B: 404 Nenájdené + Chybové hlásenie ``` #### Krok 3: Spojenie všetkého dohromady Teraz tá uspokojivá časť – prepojme vašu funkciu na získavanie účtu s prihlasovacím procesom. Tu to všetko zapadne na svoje miesto: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; const data = await getAccount(user); if (data.error) { return console.log('loginError', data.error); } account = data; navigate('/dashboard'); } ``` Táto funkcia nasleduje jasný postup: - Extrahuje používateľské meno zo vstupu formulára - Požiada server o dáta používateľa - Rieši prípadné chyby počas procesu - Uloží dáta o účte a po úspechu prejde na dashboard > 🎯 **Vzorec async/await**: Keďže `getAccount` je asynchrónna funkcia, používame kľúčové slovo `await`, aby sme počkali, kým server nezareaguje. Tým zabránime pokračovaniu kódu s nedefinovanými dátami. #### Krok 4: Vytvorenie miesta pre dáta Aplikácia potrebuje miesto, kde si zapamätá informácie o účte, keď sú načítané. Predstavte si to ako krátkodobú pamäť aplikácie – miesto, kde ukladá aktuálne dáta používateľa poruke. Pridajte tento riadok na začiatok vášho súboru `app.js`: ```javascript // Toto uchováva údaje účtu aktuálneho používateľa let account = null; ``` **Prečo to potrebujeme:** - Umožňuje prístup k dátam účtu z ľubovoľného miesta v aplikácii - Začíname s `null`, čo znamená „nikto nie je prihlásený“ - Hodnota sa aktualizuje, keď sa používateľ úspešne prihlási alebo zaregistruje - Funguje ako jediný zdroj pravdy – žiadne zmätky, kto je prihlásený #### Krok 5: Prepojenie formulára Teraz prepojme vašu novú prihlasovaciu funkciu s HTML formulárom. Aktualizujte tag formulára takto: ```html
``` **Čo tento malý update robí:** - Zastaví formulár od štandardného „preinštalovania celej stránky“ - Zavolá vašu vlastnú JavaScript funkciu - Zabezpečí plynulosť a efekt SPA - Dáva vám plnú kontrolu nad tým, čo sa stane, keď používateľ klikne na „Login“ #### Krok 6: Vylepšenie registračnej funkcie Pre konzistenciu aktualizujte svoju funkciu `register`, aby tiež ukladala dáta účtu a presmerovala na dashboard: ```javascript // Pridajte tieto riadky na koniec vašej funkcie register account = result; navigate('/dashboard'); ``` **Táto úprava prináša:** - **Plynulý** prechod z registrácie na dashboard - **Konzistentný** používateľský zážitok medzi prihlásením a registráciou - **Okamžitý** prístup k dátam účtu po úspešnej registrácii #### Testovanie vašej implementácie ```mermaid flowchart TD A[Používateľ zadáva prihlasovacie údaje] --> B[Volá sa funkcia prihlásenia] B --> C[Načítať údaje účtu zo servera] C --> D{Údaje boli úspešne prijaté?} D -->|Áno| E[Globálne uložiť údaje účtu] D -->|Nie| F[Zobraziť chybovú správu] E --> G[Prejsť na ovládací panel] F --> H[Používateľ zostáva na prihlasovacej stránke] ``` **Čas otestovať:** 1. Vytvorte nový účet a overte, že všetko funguje 2. Skúste sa prihlásiť s týmito istými údajmi 3. Pozrite si konzolu prehliadača (F12), ak sa niečo javí divne 4. Uistite sa, že po prihlásení skončíte na dashboarde Ak niečo nefunguje, nebojte sa! Väčšina problémov je jednoduchá na opravu, ako preklepy alebo zabudnuté spustenie API servera. #### Krátka poznámka o magii medzi rôznymi doménami Možno sa pýtate: „Ako moja webová aplikácia komunikuje s API serverom, keď bežia na rôznych portoch?“ Skvelá otázka! Toto je téma, na ktorú všetci weboví vývojári narazia. > 🔒 **Bezpečnosť medzi doménami**: Prehliadače uplatňujú „politiku rovnakého pôvodu“, aby zabránili neoprávnenej komunikácii medzi rôznymi doménami. Ako bezpečnostná kontrolná stanica v Pentagone, overujú, že komunikácia je autorizovaná, skôr než povolia prenos dát. > **V našom nastavení:** - Vaša webová aplikácia beží na `localhost:3000` (vývojársky server) - Vaše API beží na `localhost:5000` (backend server) - API server obsahuje [CORS hlavičky](https://developer.mozilla.org/docs/Web/HTTP/CORS), ktoré explicitne povoľujú komunikáciu z vašej webovej aplikácie Toto nastavenie zrkadlí reálny vývoj, kde frontend a backend aplikácie bežne bežia na samostatných serveroch. > 📚 **Viac informácií**: Ponorte sa hlbšie do tém API a získavania dát cez komplexný [Microsoft Learn modul o API](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon). ## Oživenie dát v HTML Teraz sprístupníme získané dáta používateľom cez manipuláciu s DOM. Ako proces vyvolávania fotografií v temnej komore, berieme neviditeľné dáta a vykresľujeme ich do niečoho, čo môžu používatelia vidieť a s čím môžu pracovať. Manipulácia s DOM je technika, ktorá premení statické webové stránky na dynamické aplikácie, ktoré aktualizujú svoj obsah na základe interakcií používateľa a odpovedí servera. ### Výber správneho nástroja pre prácu Keď ide o aktualizáciu vášho HTML pomocou JavaScriptu, máte niekoľko možností. Predstavte si ich ako rôzne nástroje v skrinke – každý je ideálny na konkrétnu úlohu: | Metóda | Na čo je skvelá | Kedy ju použiť | Úroveň bezpečnosti | |--------|-----------------|----------------|-------------------| | `textContent` | Bezpečné zobrazovanie používateľských údajov | Vždy, keď zobrazujete text | ✅ Pevne spoľahlivá | | `createElement()` + `append()` | Vytváranie komplexných rozložení | Pri vytváraní nových sekcií/zoznamov | ✅ Nezmar | | `innerHTML` | Nastavenie HTML obsahu | ⚠️ Snažte sa tomu vyhnúť | ❌ Riziková záležitosť | #### Bezpečný spôsob zobrazovania textu: textContent Vlastnosť [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) je váš najlepší priateľ pri zobrazovaní používateľských údajov. Je to ako šatniar na vašej webovej stránke – nič škodlivé cez neho neprejde: ```javascript // Bezpečný a spoľahlivý spôsob aktualizácie textu const balanceElement = document.getElementById('balance'); balanceElement.textContent = account.balance; ``` **Výhody textContent:** - Všetko spracováva ako obyčajný text (zabraňuje vykonaniu skriptov) - Automaticky vymaže existujúci obsah - Efektívne pre jednoduché aktualizácie textu - Poskytuje vstavanú ochranu proti škodlivému obsahu #### Vytváranie dynamických HTML prvkov Pre komplexnejší obsah kombinujte [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) s metódou [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append): ```javascript // Bezpečný spôsob vytvárania nových prvkov const transactionItem = document.createElement('div'); transactionItem.className = 'transaction-item'; transactionItem.textContent = `${transaction.date}: ${transaction.description}`; container.append(transactionItem); ``` **Ako tento prístup funguje:** - **Vytvára** nové DOM prvky programovo - **Udržiava** úplnú kontrolu nad atribútmi a obsahom prvkov - **Umožňuje** zložité, vnorené štruktúry prvkov - **Zachováva** bezpečnosť oddelením štruktúry od obsahu > ⚠️ **Bezpečnostné upozornenie**: Aj keď sa [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) objavuje v mnohých tutoriáloch, môže vykonávať vložené skripty. Ako bezpečnostné protokoly v CERN-e, ktoré zabraňujú neoprávnenému spusteniu kódu, aj použitie `textContent` a `createElement` poskytuje bezpečnejšie alternatívy. > **Riziká innerHTML:** - Vykonáva akékoľvek `