# बैंकिंग ऐप बनाएं भाग 3: डेटा प्राप्त करने और उपयोग करने के तरीके ## प्री-लेक्चर क्विज़ [प्री-लेक्चर क्विज़](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` मान का उपयोग करते हैं, तो हमें किस प्रकार की समस्याओं का सामना करना पड़ सकता है? अब हम अपने `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