← Back to JavaScript Course | Chapter 9: Async & Web APIs | Lesson 17 of 26

JS AJAX डेटाबेस

AJAX requests का एक बड़ा हिस्सा खासतौर पर किसी database से पढ़ने या उसमें लिखने के लिए मौजूद है -- कोई live product list लाना, कोई नया comment save करना, कोई status update करना -- client पर JavaScript request भेजता है और एक server-side script असली database query चलाकर result return करती है।

AJAX से Database Data Fetch करना

एक read-only AJAX endpoint एक database query चलाता है और matching rows को JSON के रूप में return करता है -- JavaScript side बस उस JSON को fetch और parse करता है, बिना SQL, tables, या शामिल database engine की किसी जानकारी के।

Note: client-side JavaScript को पूरी तरह data request करने और render करने पर केंद्रित रखें, server को यह हर बारीकी संभालने दें कि वह data असल में कैसे store और query किया जाता है।
Warning: किसी database table के हर column को return करना, client पर कभी इस्तेमाल न होने वाले (या बदतर, sensitive) columns सहित, database-backed AJAX endpoints में एक आम accidental data leak है।

उदाहरण: Fetching Database Data via AJAX

javascript
fetch("get-users.php")
  .then(response => response.json())
  .then(rows => console.log(rows)); // JS just parses JSON, no SQL knowledge needed

AJAX से Database में Data Save करना

एक write AJAX endpoint submitted data को पढ़ता है, उसे validate करता है, और server side पर एक prepared statement इस्तेमाल करके उसे database में insert या update करता है -- JavaScript side request भेजता है और एक confirmation वापस पढ़ता है, हुई database operation की किसी सीधी जानकारी के बिना।

Note: किसी save endpoint के JSON response को यह confirm करने के लिए design करें कि असल में क्या हुआ (जैसे नए record की ID return करना), JavaScript को UI को सही तरीके से update करने लायक काफी जानकारी देते हुए।
Warning: एक save endpoint जो बिना किसी उपयोगी data (जैसे नए record की ID) के सिर्फ एक generic "success" return करता है, client को सिर्फ यह पता लगाने के लिए एक अतिरिक्त request करने पर मजबूर करता है कि क्या बनाया गया।

उदाहरण: Saving Data to a Database via AJAX

javascript
// Send a POST request with a JSON body to save-user.php
fetch("save-user.php", {
  method: "POST",
  headers: { "Content-Type": "application/json" }, // tell the server we're sending JSON
  body: JSON.stringify({ name: "Sam" }), // convert the JS object into a JSON string
}).then(r => r.json()).then(confirmation => console.log(confirmation)); // parse and log the server's JSON reply

Server-Side Filtering, Sorting, और Pagination

किसी भी काफी बड़े dataset के लिए, filtering, sorting, और pagination server की database query में होनी चाहिए, हर row fetch करके उसे JavaScript में process करने से नहीं -- client अपने चाहे filters को query parameters के रूप में भेजता है, और server का SQL WHERE/ORDER BY/LIMIT असली काम करता है।

Note: filter, sort, और page parameters को AJAX request में query parameters के रूप में पास करें, client-side पर पूरा dataset filter करने के बजाय server की database query को उन्हें सीधे संभालने दें।
Warning: AJAX से एक पूरी table fetch करना और उसे JavaScript में filter करना छोटे datasets के लिए काम करता है पर underlying table के बढ़ने पर एक गंभीर performance समस्या बन जाता है।

उदाहरण: Server-Side Filtering, Sorting, and Pagination

javascript
const page = 2, sortBy = "name";
fetch(`get-users.php?page=${page}&sort=${sortBy}`)
  .then(r => r.json())
  .then(rows => console.log(rows)); // filtering/sorting done server-side

Loading और Empty States संभालना

एक database-backed AJAX request में एक ध्यान देने लायक पल लग सकता है, और यह zero matching rows भी return कर सकती है -- एक polished UI इंतज़ार के दौरान एक loading indicator दिखाता है, और response में एक खाली array होने पर एक blank area के बजाय एक साफ "no results" message दिखाता है।

Note: किसी AJAX response से render की गई किसी भी list के लिए हमेशा एक explicit empty state (एक friendly "no results found" message) design करें, किसी खाली array को चुपचाप एक blank section बनाने देने के बजाय।
Warning: एक second या ज़्यादा लेने वाली database-backed request के दौरान कोई visual feedback न देना interface को टूटा हुआ या unresponsive महसूस करा सकता है, भले ही वह सही से काम कर रहा हो।

उदाहरण: Handling Loading and Empty States

javascript
// Assign "<p>Loading...</p>" to `document.body.innerHTML`
// Assign "<p>Loading...</p>" to `document.body.innerHTML`
document.body.innerHTML = "<p>Loading...</p>";
// Define the method `fetch` taking `"get-users.php"`
// Define the method `fetch` taking `"get-users.php"`
fetch("get-users.php")
  // On success, run this with the resolved value as `r`
  // On success, run this with the resolved value as `r`
  .then(r => r.json())
  // On success, run this with the resolved value as `rows`
  // On success, run this with the resolved value as `rows`
  .then(rows => {
    // Assign `rows.length ? JSON.stringify(rows) : "<p>No results</p>"` to `document.body.innerHTML`
    // Assign `rows.length ? JSON.stringify(rows) : "<p>No results</p>"` to `document.body.innerHTML`
    document.body.innerHTML = rows.length ? JSON.stringify(rows) : "<p>No results</p>";
  });

Database-Backed Endpoints के लिए Error Handling

एक database query client के control से पूरी तरह बाहर की वजहों से fail हो सकती है -- एक connection समस्या, एक constraint violation -- और server को इन्हें catch करना चाहिए, असली detail log करनी चाहिए, और एक generic, safe error message return करनी चाहिए जिसे JavaScript user को internal database details दिखाए बिना display करे।

Note: database-backed AJAX endpoints को हमेशा failure पर एक consistent error shape return करने के लिए design करें, ताकि client-side error handling code सरल और predictable बना रहे।
Warning: किसी raw database error message को सीधे end user को दिखाना (server से बिना filter किए पास किया गया) users को उलझा सकता है और sensitive backend details भी leak कर सकता है।

उदाहरण: Error Handling for Database-Backed Endpoints

javascript
fetch("get-users.php")
  .then(response => {
    if (!response.ok) throw new Error("Something went wrong");
    return response.json();
  })
  .then(rows => console.log(rows))
  .catch(() => console.log("Unable to load data right now")); // no internal DB details exposed
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. server पर AJAX-submitted values को सीधे SQL में concatenate करके database queries बनाना, बिल्कुल किसी दूसरे untrusted input जितने ही SQL injection risk के साथ।
  2. सिर्फ एक filtered, paginated slice चाहिए होने पर AJAX से एक पूरा बड़ा dataset fetch करना, bandwidth बर्बाद करते हुए और response धीमा करते हुए।
  3. किसी database-backed AJAX request का इंतज़ार करते हुए (या उससे एक empty result मिलने के बाद) JavaScript UI में loading और empty states handle न करना।
चैप्टर सारांश
  • एक database-backed AJAX endpoint एक query चलाता है (किसी भी user-supplied value के लिए prepared statements इस्तेमाल करते हुए) और result को JSON की तरह return करता है।
  • client-side JavaScript को database के बारे में बिल्कुल पता नहीं होता -- यह सिर्फ वह JSON response देखता है जो server भेजना चुनता है।
  • Filtering, sorting, और pagination आमतौर पर server side पर database query के ज़रिए handle किए जाते हैं, सब कुछ fetch करके JavaScript में process करने के बजाय।
ब्राउज़र सपोर्ट

Database-backed AJAX endpoints server-side language या database engine चाहे जो भी हो समान रूप से काम करते हैं, क्योंकि browser सिर्फ final HTTP response देखता है।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.