# ਬੈਂਕਿੰਗ ਐਪ ਬਣਾਓ ਭਾਗ 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` ਮੁੱਲ ਨੂੰ 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