# Vytvorenie bankovej aplikácie, časť 3: Metódy získavania a používania údajov Predstavte si počítač na lodi Enterprise zo Star Treku - keď kapitán Picard požiada o stav lode, informácie sa okamžite zobrazia bez toho, aby sa celé rozhranie vyplo a znovu načítalo. Presne taký plynulý tok informácií sa snažíme dosiahnuť pri dynamickom získavaní údajov. Momentálne je vaša banková aplikácia ako vytlačené noviny - informatívna, ale statická. Premeníme ju na niečo podobné riadiacemu stredisku NASA, kde údaje prúdia nepretržite a aktualizujú sa v reálnom čase bez prerušenia pracovného toku používateľa. Naučíte sa, ako komunikovať so servermi asynchrónne, spracovávať údaje, ktoré prichádzajú v rôznych časoch, a transformovať surové informácie na niečo zmysluplné pre vašich používateľov. Toto je rozdiel medzi ukážkou a softvérom pripraveným na produkciu. ## Kvíz pred prednáškou [Prednáškový kvíz](https://ff-quizzes.netlify.app/web/quiz/45) ### Predpoklady Predtým, než sa pustíte do získavania údajov, uistite sa, že máte pripravené tieto komponenty: - **Predchádzajúca lekcia**: Dokončite [Prihlasovací a registračný formulár](../2-forms/README.md) - budeme na tom stavať - **Lokálny server**: Nainštalujte [Node.js](https://nodejs.org) a [spustite server API](../api/README.md), aby ste mohli poskytovať údaje o účte - **Pripojenie k API**: Otestujte pripojenie k serveru pomocou tohto príkazu: ```bash curl http://localhost:5000/api # Expected response: "Bank API v1.0.0" ``` Tento rýchly test zabezpečí správnu komunikáciu všetkých komponentov: - Overí, že Node.js na vašom systéme funguje správne - Potvrdí, že váš API server je aktívny a reaguje - Overí, že vaša aplikácia dokáže dosiahnuť server (ako kontrola rádiového spojenia pred misiou) --- ## Pochopenie získavania údajov v moderných webových aplikáciách Spôsob, akým webové aplikácie spracovávajú údaje, sa za posledné dve desaťročia dramaticky vyvinul. Pochopenie tohto vývoja 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. Preskúmajme, ako fungovali tradičné webové stránky v porovnaní s dynamickými, responzívnymi aplikáciami, ktoré dnes vytvárame. ### Tradičné viacstránkové aplikácie (MPA) V začiatkoch internetu bol každý klik ako prepínanie kanálov na starom televízore - obrazovka by sa vyprázdnila a potom pomaly naladila nový obsah. Takto fungovali skoré webové aplikácie, kde každá interakcia znamenala úplné prebudovanie celej stránky od začiatku. ```mermaid sequenceDiagram participant User participant Browser participant Server User->>Browser: Clicks link or submits form Browser->>Server: Requests new HTML page Note over Browser: Page goes blank Server->>Browser: Returns complete HTML page Browser->>User: Displays new page (flash/reload) ```  **Prečo tento prístup pôsobil nemotorne:** - Každý klik znamenal úplné prebudovanie celej stránky od začiatku - Používatelia boli vyrušovaní nepríjemnými zábleskami stránky - Vaše internetové pripojenie pracovalo nadčas pri opakovanom sťahovaní rovnakého záhlavia a päty - Aplikácie pôsobili skôr ako prechádzanie kartotékou než používanie softvéru ### Moderné jednostránkové aplikácie (SPA) AJAX (Asynchronous JavaScript and XML) úplne zmenil tento paradigmat. Podobne ako modulárny dizajn Medzinárodnej vesmírnej stanice, kde astronauti môžu nahradiť jednotlivé komponenty bez prebudovania celej štruktúry, AJAX nám umožňuje aktualizovať konkrétne časti webovej stránky bez jej úplného načítania. Napriek tomu, že názov spomína XML, dnes väčšinou používame JSON, ale základný princíp zostáva: aktualizovať iba to, čo sa musí zmeniť. ```mermaid sequenceDiagram participant User participant Browser participant JavaScript participant Server User->>Browser: Interacts with page Browser->>JavaScript: Triggers event handler JavaScript->>Server: Fetches only needed data Server->>JavaScript: Returns JSON data JavaScript->>Browser: Updates specific page elements Browser->>User: Shows updated content (no reload) ```  **Prečo sú SPA oveľa lepšie:** - Aktualizujú sa iba časti, ktoré sa skutočne zmenili (šikovné, však?) - Žiadne rušivé prerušenia - vaši používatelia zostávajú v toku - Menej údajov cestuje cez sieť, čo znamená rýchlejšie načítanie - Všetko pôsobí svižne 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). Podobne ako rozdiel medzi obsluhou telegrafu a používaním e-mailu, Fetch API používa promises na čistejší asynchrónny kód a prirodzene spracováva JSON. | Funkcia | XMLHttpRequest | Fetch API | |---------|----------------|-----------| | **Syntax** | Zložitá, založená na callbackoch | Čistá, založená na promises | | **Spracovanie JSON** | Vyžaduje manuálne parsovanie | Zabudovaná metóda `.json()` | | **Spracovanie chýb** | Obmedzené informácie o chybách | Komplexné detaily o chybách | | **Moderná podpora** | Kompatibilita so staršími verziami | 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ý príbeh o kompatibilite. > **Zhrnutie:** - Funguje skvele v Chrome, Firefox, Safari a Edge (prakticky všade, kde sú vaši používatelia) - Iba Internet Explorer potrebuje dodatočnú pomoc (a úprimne, je čas sa rozlúčiť s IE) - Perfektne vás pripraví na elegantné vzory async/await, ktoré budeme používať neskôr ### Implementácia prihlásenia používateľa a získavania údajov Teraz implementujeme systém prihlásenia, ktorý transformuje vašu bankovú aplikáciu zo statického zobrazenia na funkčnú aplikáciu. Podobne ako autentifikačné protokoly používané v zabezpečených vojenských zariadeniach, overíme poverenia používateľa a potom poskytneme prístup k jeho konkrétnym údajom. Budeme to budovať postupne, začneme základnou autentifikáciou a potom pridáme schopnosti získavania údajov. #### Krok 1: Vytvorenie základu funkcie prihlásenia Otvorte svoj súbor `app.js` a pridajte novú funkciu `login`. Táto funkcia bude spracovávať proces autentifikácie používateľa: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; } ``` **Rozdelenie:** - Kľúčové slovo `async` hovorí JavaScriptu: "hej, táto funkcia možno bude musieť na niečo počkať" - Získavame formulár zo stránky (nič zložité, len ho nájdeme podľa jeho ID) - Potom vyberáme, čo používateľ napísal ako svoje používateľské meno - Tu je šikovný trik: k akémukoľvek vstupu formulára môžete pristupovať pomocou jeho atribútu `name` - netreba žiadne ďalšie volania getElementById! > 💡 **Vzor prístupu k formuláru**: Ku každému ovládaciemu prvku formulára je možné pristupovať podľa jeho názvu (nastaveného v HTML pomocou atribútu `name`) ako k vlastnosti elementu formulára. To poskytuje čistý a čitateľný spôsob získavania údajov z formulára. #### Krok 2: Vytvorenie funkcie na získavanie údajov o účte Ďalej vytvoríme samostatnú funkciu na získavanie údajov o účte zo servera. Táto funkcia nasleduje rovnaký vzor ako vaša registračná funkcia, ale zameriava sa na získavanie údajov: ```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 požiadanie údajov - **Kombinuje** URL požiadavky GET s parametrom používateľského mena - **Používa** `encodeURIComponent()` na bezpečné spracovanie špeciálnych znakov v URL - **Konvertuje** odpoveď na formát JSON pre jednoduchú manipuláciu s údajmi - **Spracováva** chyby elegantne, vracia objekt chyby namiesto zlyhania > ⚠️ **Bezpečnostná poznámka**: Funkcia `encodeURIComponent()` spracováva špeciálne znaky v URL. Podobne ako kódovacie systémy používané v námorných komunikáciách, zabezpečuje, že vaša správa dorazí presne tak, ako bola zamýšľaná, a zabraňuje nesprávnemu interpretovaniu znakov ako "#" alebo "&". > **Prečo je to dôležité:** - Zabraňuje špeciálnym znakom v narušení URL - Chráni pred útokmi manipulácie s URL - Zabezpečuje, že váš server dostane zamýšľané údaje - Nasleduje bezpečnostné postupy pri kódovaní #### Pochopenie HTTP GET požiadaviek Možno vás prekvapí: keď použijete `fetch` bez akýchkoľvek ďalších možností, automaticky vytvorí [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) požiadavku. To je ideálne pre to, čo robíme - pýtame sa servera "hej, môžem vidieť údaje o účte tohto používateľa?" Premýšľajte o GET požiadavkách ako o zdvorilom požiadaní o požičanie knihy z knižnice - žiadate o niečo, čo už existuje. POST požiadavky (ktoré sme použili pri registrácii) sú skôr ako odovzdanie novej knihy na pridanie do zbierky. | GET požiadavka | POST požiadavka | |----------------|-----------------| | **Účel** | Získanie existujúcich údajov | Odoslanie nových údajov na server | | **Parametre** | V ceste URL/reťazci dotazu | V tele požiadavky | | **Ukladanie do vyrovnávacej pamäte** | Môže byť uložené do vyrovnávacej pamäte prehliadačom | Zvyčajne sa neukladá do vyrovnávacej pamäte | | **Bezpečnosť** | Viditeľné v URL/logoch | Skryté v tele požiadavky | #### Krok 3: Spojenie všetkého dohromady Teraz prichádza uspokojivá časť - spojme funkciu na získavanie údajov o účte s procesom prihlásenia. Tu 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ú postupnosť: - Získanie používateľského mena z vstupu formulára - Požiadanie servera o údaje o účte používateľa - Spracovanie akýchkoľvek chýb, ktoré sa vyskytnú počas procesu - Uloženie údajov o účte a presmerovanie na dashboard po úspechu > 🎯 **Vzor async/await**: Keďže `getAccount` je asynchrónna funkcia, používame kľúčové slovo `await`, aby sme pozastavili vykonávanie, kým server neodpovie. To zabraňuje pokračovaniu kódu s nedefinovanými údajmi. #### Krok 4: Vytvorenie miesta pre vaše údaje Vaša aplikácia potrebuje miesto, kde si zapamätá informácie o účte, keď sa načítajú. Myslite na to ako na krátkodobú pamäť vašej aplikácie - miesto, kde si uchová aktuálne údaje používateľa. Pridajte tento riadok na začiatok vášho súboru `app.js`: ```javascript // This holds the current user's account data let account = null; ``` **Prečo to potrebujeme:** - Uchováva údaje o účte dostupné z akéhokoľvek miesta vo vašej aplikácii - Začiatok s `null` znamená "nikto ešte nie je prihlásený" - Aktualizuje sa, keď sa niekto úspešne prihlási alebo zaregistruje - Funguje ako jediný zdroj pravdy - žiadne zmätky o tom, kto je prihlásený #### Krok 5: Prepojenie vášho formulára Teraz prepojme vašu novú funkciu prihlásenia s vaším HTML formulárom. Aktualizujte značku formulára takto: ```html
``` **Čo táto malá zmena robí:** - Zastaví formulár od vykonania jeho predvoleného správania "znovu načítať celú stránku" - Zavolá vašu vlastnú funkciu JavaScript namiesto toho - Udržiava všetko hladké a podobné jednostránkovej aplikácii - Poskytuje vám úplnú kontrolu nad tým, čo sa stane, keď používatelia kliknú na "Prihlásiť sa" #### Krok 6: Vylepšenie vašej registračnej funkcie Pre konzistenciu aktualizujte svoju funkciu `register`, aby tiež uchovávala údaje o účte a presmerovala na dashboard: ```javascript // Add these lines at the end of your register function account = result; navigate('/dashboard'); ``` **Toto vylepšenie poskytuje:** - **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 údajom o účte po úspešnej registrácii #### Testovanie vašej implementácie ```mermaid flowchart TD A[User enters credentials] --> B[Login function called] B --> C[Fetch account data from server] C --> D{Data received successfully?} D -->|Yes| E[Store account data globally] D -->|No| F[Display error message] E --> G[Navigate to dashboard] F --> H[User stays on login page] ``` **Čas na skúšku:** 1. Vytvorte nový účet, aby ste sa uistili, že všetko funguje 2. Skúste sa prihlásiť s rovnakými povereniami 3. Pozrite sa na konzolu vášho prehliadača (F12), ak niečo nefunguje 4. Uistite sa, že sa dostanete na dashboard po úspešnom prihlásení Ak niečo nefunguje, nepanikárte! Väčšina problémov sú jednoduché chyby, ako preklepy alebo zabudnutie spustiť API server. #### Rýchle slovo o magickom Cross-Origin Možno sa pýtate: "Ako moja webová aplikácia komunikuje s týmto API serverom, keď bežia na rôznych portoch?" Skvelá otázka! Toto sa dotýka niečoho, na čo narazí každý webový vývojár. > 🔒 **Bezpečnosť Cross-Origin**: Prehliadače uplatňujú "politiku rovnakého pôvodu", aby zabránili neoprávnenej komunikácii medzi rôznymi doménami. Podobne ako kontrolný systém v Pentagone, overujú, že komunikácia je autorizovaná pred povolením prenosu údajov. > **V našom nastavení:** - Vaša webová aplikácia beží na `localhost:3000` (vývojový server) - Váš API server beží na `localhost:5000` (backend server) - API server obsahuje [CORS hlavičky](https://developer.mozilla.org/docs/Web/HTTP/CORS), ktoré explicitne autorizujú komunikáciu z vašej webovej aplikácie Táto konfigurácia odráža reálny vývoj, kde frontendové a backendové aplikácie zvyčajne bežia na samostatných serveroch. > 📚 **Viac informácií**: Ponorte sa hlbšie do API a získavania údajov s týmto komplexným [modulom Microsoft Learn o API](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon). ## Oživenie vašich údajov v HTML Teraz sprístupníme získané údaje používateľom prostredníctvom manipulácie s DOM. Podobne ako proces vyvolávania fotografií v tmavej komore, berieme neviditeľné údaje a zobrazujeme ich tak, aby ich používatelia mohli vidieť a interagovať s nimi. Manipulácia s DOM je technika, ktorá transformuje statické webové stránky na dynamické aplikácie, ktoré aktualizujú svoj obsah na základe interakcií používateľov a odpovedí server Pre komplexnejší obsah skombinujte [`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 // Safe way to create new elements const transactionItem = document.createElement('div'); transactionItem.className = 'transaction-item'; transactionItem.textContent = `${transaction.date}: ${transaction.description}`; container.append(transactionItem); ``` **Pochopenie tohto prístupu:** - **Vytvára** nové DOM elementy programovo - **Umožňuje** plnú kontrolu nad atribútmi a obsahom elementov - **Podporuje** komplexné, vnorené štruktúry elementov - **Zachováva** bezpečnosť oddelením štruktúry od obsahu > ⚠️ **Bezpečnostné upozornenie**: Hoci [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) sa často objavuje v tutoriáloch, môže vykonávať vložené skripty. Podobne ako bezpečnostné protokoly v CERN, ktoré zabraňujú neoprávnenému vykonávaniu kódu, použitie `textContent` a `createElement` poskytuje bezpečnejšie alternatívy. > **Riziká innerHTML:** - Vykonáva akékoľvek `