# बैंकिङ एप निर्माण भाग ३: डेटा प्राप्त गर्ने र प्रयोग गर्ने विधिहरू ## प्रि-लेक्चर क्विज [प्रि-लेक्चर क्विज](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) पनि कार्यान्वयन गर्छन्, जुन प्रतिज्ञा (promises) प्रयोग गर्छ र 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