# Gumawa ng Banking App Bahagi 3: Mga Paraan ng Pagkuha at Paggamit ng Data ## Pre-Lecture Quiz [Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/45) ### Panimula Sa pinakapuso ng bawat web application ay ang *data*. Ang data ay maaaring magkaroon ng iba't ibang anyo, ngunit ang pangunahing layunin nito ay palaging magpakita ng impormasyon sa user. Habang ang mga web app ay nagiging mas interactive at kumplikado, ang paraan ng pag-access at pakikisalamuha ng user sa impormasyon ay naging mahalagang bahagi ng web development. Sa araling ito, makikita natin kung paano kumuha ng data mula sa server nang asynchronous, at gamitin ang data na ito upang magpakita ng impormasyon sa isang web page nang hindi nire-reload ang HTML. ### Paunang Kaalaman Kailangan mong nakagawa na ng [Login at Registration Form](../2-forms/README.md) na bahagi ng web app para sa araling ito. Kailangan mo ring mag-install ng [Node.js](https://nodejs.org) at [patakbuhin ang server API](../api/README.md) nang lokal upang makuha ang data ng account. Maaari mong subukan kung gumagana nang maayos ang server sa pamamagitan ng pag-execute ng command na ito sa terminal: ```sh curl http://localhost:5000/api # -> should return "Bank API v1.0.0" as a result ``` --- ## AJAX at pagkuha ng data Ang tradisyunal na mga website ay nag-a-update ng nilalaman na ipinapakita kapag ang user ay pumili ng link o nag-submit ng data gamit ang isang form, sa pamamagitan ng pag-reload ng buong HTML page. Sa tuwing kailangang mag-load ng bagong data, ang web server ay nagbabalik ng panibagong HTML page na kailangang iproseso ng browser, na nagiging sanhi ng pagkaantala sa kasalukuyang aksyon ng user at nililimitahan ang interaksyon sa panahon ng pag-reload. Ang workflow na ito ay tinatawag ding *Multi-Page Application* o *MPA*.  Nang magsimulang maging mas kumplikado at interactive ang mga web application, lumitaw ang isang bagong teknolohiya na tinatawag na [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)). Ang teknolohiyang ito ay nagbibigay-daan sa mga web app na magpadala at kumuha ng data mula sa server nang asynchronous gamit ang JavaScript, nang hindi kailangang i-reload ang HTML page, na nagreresulta sa mas mabilis na pag-update at mas maayos na interaksyon ng user. Kapag natanggap ang bagong data mula sa server, ang kasalukuyang HTML page ay maaari ring ma-update gamit ang JavaScript sa pamamagitan ng [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API. Sa paglipas ng panahon, ang approach na ito ay umunlad sa tinatawag na [*Single-Page Application* o *SPA*](https://en.wikipedia.org/wiki/Single-page_application).  Noong unang ipinakilala ang AJAX, ang tanging API na magagamit upang kumuha ng data nang asynchronous ay ang [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest). Ngunit ang mga modernong browser ngayon ay nagpatupad na rin ng mas maginhawa at mas makapangyarihang [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API), na gumagamit ng promises at mas angkop para sa pag-manipula ng JSON data. > Bagamat sinusuportahan ng lahat ng modernong browser ang `Fetch API`, kung nais mong gumana ang iyong web application sa mga lumang browser, palaging magandang ideya na suriin muna ang [compatibility table sa caniuse.com](https://caniuse.com/fetch). ### Gawain Sa [nakaraang aralin](../2-forms/README.md) ipinatupad natin ang registration form upang lumikha ng account. Ngayon, magdadagdag tayo ng code upang mag-login gamit ang umiiral na account, at kunin ang data nito. Buksan ang file na `app.js` at magdagdag ng bagong function na `login`: ```js async function login() { const loginForm = document.getElementById('loginForm') const user = loginForm.user.value; } ``` Dito nagsisimula tayo sa pagkuha ng form element gamit ang `getElementById()`, at pagkatapos ay kinukuha natin ang username mula sa input gamit ang `loginForm.user.value`. Ang bawat form control ay maaaring ma-access sa pamamagitan ng pangalan nito (na itinakda sa HTML gamit ang attribute na `name`) bilang property ng form. Katulad ng ginawa natin para sa registration, gagawa tayo ng isa pang function upang magsagawa ng server request, ngunit sa pagkakataong ito para sa pagkuha ng data ng account: ```js 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' }; } } ``` Ginagamit natin ang `fetch` API upang mag-request ng data nang asynchronous mula sa server, ngunit sa pagkakataong ito hindi natin kailangan ng anumang extra parameters maliban sa URL na tatawagin, dahil nag-query lang tayo ng data. Sa default, ang `fetch` ay gumagawa ng [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP request, na siyang hinahanap natin dito. ✅ Ang `encodeURIComponent()` ay isang function na nag-e-escape ng mga espesyal na karakter para sa URL. Anong mga problema ang maaaring mangyari kung hindi natin tatawagin ang function na ito at direktang gagamitin ang value ng `user` sa URL? Ngayon ay i-update natin ang ating `login` function upang gamitin ang `getAccount`: ```js 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'); } ``` Una, dahil ang `getAccount` ay isang asynchronous function, kailangan natin itong i-match sa keyword na `await` upang hintayin ang resulta ng server. Tulad ng anumang server request, kailangan din nating harapin ang mga kaso ng error. Sa ngayon, magdadagdag lang tayo ng log message upang ipakita ang error, at babalikan ito mamaya. Pagkatapos, kailangan nating i-store ang data sa isang lugar upang magamit ito sa pag-display ng impormasyon sa dashboard. Dahil ang variable na `account` ay hindi pa umiiral, gagawa tayo ng global variable para dito sa itaas ng ating file: ```js let account = null; ``` Pagkatapos ma-save ang user data sa isang variable, maaari na tayong mag-navigate mula sa *login* page patungo sa *dashboard* gamit ang `navigate()` function na mayroon na tayo. Sa wakas, kailangan nating tawagin ang ating `login` function kapag na-submit ang login form, sa pamamagitan ng pag-modify sa HTML: ```html