# बैंकिङ एप निर्माण भाग ३: डेटा प्राप्ति र प्रयोग गर्ने विधिहरू ## प्रि-लेक्चर क्विज [प्रि-लेक्चर क्विज](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 पृष्ठ पुनःलोड नगरी सर्भरबाट डेटा असिन्क्रोनस रूपमा पठाउन र प्राप्त गर्न अनुमति दिन्छ, जसले गर्दा छिटो अद्यावधिक र सहज प्रयोगकर्ता अन्तरक्रिया सम्भव हुन्छ। सर्भरबाट नयाँ डेटा प्राप्त भएपछि, [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API प्रयोग गरेर हालको HTML पृष्ठलाई पनि JavaScript मार्फत अद्यावधिक गर्न सकिन्छ। समयसँगै, यो दृष्टिकोण [*सिंगल-पेज एप्लिकेसन* (SPA)](https://en.wikipedia.org/wiki/Single-page_application) मा विकसित भएको छ।  AJAX पहिलो पटक परिचय गराउँदा, असिन्क्रोनस रूपमा डेटा प्राप्त गर्न [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest) मात्र उपलब्ध API थियो। तर आधुनिक ब्राउजरहरूले अब अझ सुविधाजनक र शक्तिशाली [`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