# बैंकिंग ऐप बनाएं भाग 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 पहली बार पेश किया गया था, तो असिंक्रोनस रूप से डेटा प्राप्त करने के लिए केवल [`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