# बैंकिङ एप निर्माण भाग ३: डेटा प्राप्त गर्ने र प्रयोग गर्ने विधिहरू ## प्रि-लेक्चर क्विज [प्रि-लेक्चर क्विज](https://ff-quizzes.netlify.app/web/quiz/45) ### परिचय प्रत्येक वेब एप्लिकेसनको केन्द्रमा *डेटा* हुन्छ। डेटा विभिन्न प्रकारका हुन सक्छ, तर यसको मुख्य उद्देश्य सधैं प्रयोगकर्तालाई जानकारी देखाउनु हो। वेब एपहरू बढ्दो अन्तरक्रियात्मक र जटिल हुँदै गइरहेको अवस्थामा, प्रयोगकर्ताले जानकारी कसरी पहुँच गर्छ र त्यससँग कसरी अन्तरक्रिया गर्छ भन्ने कुरा वेब विकासको महत्त्वपूर्ण भाग बनिसकेको छ। यस पाठमा, हामीले कसरी सर्वरबाट डेटा एसिंक्रोनस रूपमा प्राप्त गर्ने र HTML पुनःलोड नगरी वेब पृष्ठमा जानकारी देखाउने भन्ने कुरा सिक्नेछौं। ### पूर्व-आवश्यकता यस पाठको लागि तपाईंले वेब एपको [लगइन र रजिस्ट्रेसन फारम](../2-forms/README.md) भाग निर्माण गरिसक्नुपर्छ। तपाईंले [Node.js](https://nodejs.org) स्थापना गर्नुपर्छ र [सर्भर API](../api/README.md) स्थानीय रूपमा चलाउनुपर्छ ताकि तपाईंले खाता डेटा प्राप्त गर्न सक्नुहुन्छ। सर्भर ठीकसँग चलिरहेको छ कि छैन भनेर जाँच गर्न तपाईंले टर्मिनलमा निम्न कमाण्ड चलाउन सक्नुहुन्छ: ```sh curl http://localhost:5000/api # -> should return "Bank API v1.0.0" as a result ``` --- ## AJAX र डेटा प्राप्त गर्ने परम्परागत वेबसाइटहरूले प्रयोगकर्ताले लिंक चयन गर्दा वा फारममार्फत डेटा पेश गर्दा HTML पृष्ठ पुनःलोड गरेर देखाइएको सामग्री अपडेट गर्छ। नयाँ डेटा लोड गर्न प्रत्येक पटक वेब सर्भरले नयाँ HTML पृष्ठ फर्काउँछ, जसलाई ब्राउजरले प्रक्रिया गर्नुपर्छ। यसले प्रयोगकर्ताको हालको कार्यलाई अवरोध पुर्याउँछ र पुनःलोडको क्रममा अन्तरक्रियालाई सीमित बनाउँछ। यस वर्कफ्लोलाई *मल्टि-पेज एप्लिकेसन* वा *MPA* भनिन्छ।  जब वेब एप्लिकेसनहरू जटिल र अन्तरक्रियात्मक हुन थाले, [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)) नामक नयाँ प्रविधि देखा पर्यो। यस प्रविधिले वेब एपहरूलाई HTML पृष्ठ पुनःलोड नगरी एसिंक्रोनस रूपमा सर्भरबाट डेटा पठाउन र प्राप्त गर्न अनुमति दिन्छ। यसले छिटो अपडेट र सहज प्रयोगकर्ता अन्तरक्रिया प्रदान गर्दछ। सर्भरबाट नयाँ डेटा प्राप्त भएपछि, वर्तमान HTML पृष्ठलाई [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API प्रयोग गरेर जाभास्क्रिप्टद्वारा अपडेट गर्न सकिन्छ। समयसँगै, यो प्रविधि [*सिंगल-पेज एप्लिकेसन* वा *SPA*](https://en.wikipedia.org/wiki/Single-page_application) मा विकसित भएको छ।  AJAX पहिलो पटक प्रस्तुत हुँदा, एसिंक्रोनस रूपमा डेटा प्राप्त गर्न उपलब्ध एकमात्र API [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest) थियो। तर आधुनिक ब्राउजरहरूले अब [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API) पनि लागू गरेका छन्, जसले प्रॉमिस प्रयोग गर्छ र JSON डेटा ह्यान्डल गर्न अझ सुविधाजनक र शक्तिशाली छ। > सबै आधुनिक ब्राउजरहरूले `Fetch API` समर्थन गर्छन्। तर यदि तपाईंको वेब एप पुरानो ब्राउजरमा काम गर्नुपर्छ भने, [caniuse.com](https://caniuse.com/fetch) मा अनुकूलता तालिका जाँच गर्नु राम्रो हुन्छ। ### कार्य [अघिल्लो पाठमा](../2-forms/README.md) हामीले खाता सिर्जना गर्न रजिस्ट्रेसन फारम कार्यान्वयन गरेका थियौं। अब हामीले विद्यमान खाताको प्रयोग गरेर लगइन गर्ने र यसको डेटा प्राप्त गर्ने कोड थप्नेछौं। `app.js` फाइल खोल्नुहोस् र नयाँ `login` फंक्शन थप्नुहोस्: ```js async function login() { const loginForm = document.getElementById('loginForm') const user = loginForm.user.value; } ``` यहाँ हामीले `getElementById()` प्रयोग गरेर फारम तत्व प्राप्त गर्छौं, र त्यसपछि `loginForm.user.value` बाट इनपुटबाट प्रयोगकर्ता नाम प्राप्त गर्छौं। प्रत्येक फारम कन्ट्रोललाई HTML मा `name` एट्रिब्युट प्रयोग गरेर फारमको प्रोपर्टीको रूपमा पहुँच गर्न सकिन्छ। रजिस्ट्रेसनको लागि हामीले गरेको जस्तै, हामीले सर्भर अनुरोध गर्न अर्को फंक्शन सिर्जना गर्नेछौं, तर यस पटक खाता डेटा प्राप्त गर्नको लागि: ```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' }; } } ``` हामीले `fetch` API प्रयोग गरेर सर्भरबाट डेटा एसिंक्रोनस रूपमा अनुरोध गर्छौं। यस पटक हामीलाई URL बाहेक अन्य कुनै अतिरिक्त प्यारामिटर आवश्यक छैन, किनकि हामी केवल डेटा सोध्दैछौं। डिफल्ट रूपमा, `fetch` ले [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP अनुरोध सिर्जना गर्छ, जुन हामीलाई यहाँ चाहिन्छ। ✅ `encodeURIComponent()` एक फंक्शन हो जसले URL का विशेष क्यारेक्टरहरूलाई एस्केप गर्छ। यदि हामीले यो फंक्शन नबोलाईकन `user` मानलाई URL मा सिधै प्रयोग गर्यौं भने के समस्या हुन सक्छ? अब हामीले `login` फंक्शनलाई `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'); } ``` पहिले, किनकि `getAccount` एक एसिंक्रोनस फंक्शन हो, हामीले यसलाई `await` कीवर्डसँग मिलाउनुपर्छ ताकि सर्भरको नतिजाको प्रतीक्षा गर्न सकियोस्। कुनै पनि सर्भर अनुरोधमा, हामीले त्रुटि केसहरू पनि ह्यान्डल गर्नुपर्छ। अहिलेका लागि हामी केवल त्रुटि देखाउन एक लग सन्देश थप्नेछौं, र पछि यसमा फर्कनेछौं। त्यसपछि हामीले डेटा कतै भण्डारण गर्नुपर्छ ताकि पछि ड्यासबोर्ड जानकारी देखाउन प्रयोग गर्न सकियोस्। किनकि `account` भेरिएबल अझै अवस्थित छैन, हामीले यसलाई हाम्रो फाइलको शीर्षमा एक ग्लोबल भेरिएबलको रूपमा सिर्जना गर्नेछौं: ```js let account = null; ``` प्रयोगकर्ताको डेटा भेरिएबलमा सुरक्षित भएपछि, हामीले *लगइन* पृष्ठबाट *ड्यासबोर्ड* मा `navigate()` फंक्शन प्रयोग गरेर जान सकिन्छ। अन्ततः, हामीले लगइन फारम पेश गर्दा हाम्रो `login` फंक्शनलाई कल गर्नुपर्छ। HTML संशोधन गरेर यो गर्न सकिन्छ: ```html