वेब पर डेटा पढ़ें और लिखें

(वैकल्पिक) फायरबेस स्थानीय एमुलेटर सूट के साथ प्रोटोटाइप और परीक्षण

आपका ऐप रीयलटाइम डेटाबेस से कैसे पढ़ता है और कैसे लिखता है, इस बारे में बात करने से पहले, आइए ऐसे टूल का एक सेट पेश करें जिनका उपयोग आप रीयलटाइम डेटाबेस कार्यक्षमता के प्रोटोटाइप और परीक्षण के लिए कर सकते हैं: फायरबेस लोकल एमुलेटर सूट। यदि आप अलग-अलग डेटा मॉडल आज़मा रहे हैं, अपने सुरक्षा नियमों का अनुकूलन कर रहे हैं, या बैक-एंड के साथ इंटरैक्ट करने का सबसे किफ़ायती तरीका खोजने के लिए काम कर रहे हैं, तो लाइव सेवाओं को लागू किए बिना स्थानीय रूप से काम करने में सक्षम होना एक अच्छा विचार हो सकता है।

एक रीयलटाइम डेटाबेस एमुलेटर स्थानीय एमुलेटर सूट का हिस्सा है, जो आपके ऐप को आपकी एमुलेटेड डेटाबेस सामग्री और कॉन्फ़िगरेशन के साथ-साथ वैकल्पिक रूप से आपके नकली प्रोजेक्ट संसाधनों (फ़ंक्शंस, अन्य डेटाबेस और सुरक्षा नियम) के साथ इंटरैक्ट करने में सक्षम बनाता है।

रीयलटाइम डेटाबेस एमुलेटर का उपयोग करने में कुछ ही चरण शामिल हैं:

  1. एमुलेटर से कनेक्ट करने के लिए अपने ऐप के टेस्ट कॉन्फिगर में कोड की एक लाइन जोड़ना।
  2. अपने स्थानीय परियोजना निर्देशिका की जड़, चलने से firebase emulators:start
  3. हमेशा की तरह रीयलटाइम डेटाबेस प्लेटफ़ॉर्म SDK का उपयोग करके या रीयलटाइम डेटाबेस REST API का उपयोग करके अपने ऐप के प्रोटोटाइप कोड से कॉल करना।

एक विस्तृत रीयलटाइम डेटाबेस और बादल कार्य से जुड़े पूर्वाभ्यास उपलब्ध है। तुम भी पर एक नजर है चाहिए स्थानीय एम्यूलेटर सुइट परिचय

डेटाबेस संदर्भ प्राप्त करें

पढ़ने के लिए या लिखने डेटा डेटाबेस से, आप का एक उदाहरण की जरूरत firebase.database.Reference :

वेब संस्करण 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

वेब संस्करण 8

var database = firebase.database();

डेटा लिखें

इस दस्तावेज़ में डेटा पुनर्प्राप्त करने की मूल बातें और Firebase डेटा को ऑर्डर और फ़िल्टर करने का तरीका शामिल है।

Firebase डेटा एक करने के लिए एक अतुल्यकालिक श्रोता संलग्न द्वारा लिया गया है firebase.database.Reference । डेटा की प्रारंभिक स्थिति के लिए श्रोता को एक बार ट्रिगर किया जाता है और फिर कभी भी डेटा में परिवर्तन होता है।

बेसिक राइट ऑपरेशंस

बुनियादी लिखने के संचालन के लिए, आप उपयोग कर सकते हैं set() , एक निर्दिष्ट संदर्भ के लिए डेटा को बचाने के लिए उस रास्ते पर किसी भी मौजूदा डेटा की जगह। उदाहरण के लिए सामाजिक ब्लॉगिंग आवेदन के साथ एक उपयोगकर्ता जोड़ सकते हैं set() इस प्रकार है:

वेब संस्करण 9

import { getDatabase, ref, set } from "firebase/database";

function writeUserData(userId, name, email, imageUrl) {
  const db = getDatabase();
  set(ref(db, 'users/' + userId), {
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

वेब संस्करण 8

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

का उपयोग करते हुए set() किसी भी बच्चे नोड्स सहित निर्दिष्ट स्थान के डेटा, अधिलेखित कर देता है।

डेटा पढ़ें

महत्वपूर्ण घटनाओं के लिए सुनें

एक पथ पर डेटा पढ़ सकते हैं और बदलावों को सुनने के लिए, का उपयोग onValue() की घटनाओं का पालन करने के। आप इस घटना का उपयोग किसी दिए गए पथ पर सामग्री के स्थिर स्नैपशॉट को पढ़ने के लिए कर सकते हैं, क्योंकि वे घटना के समय मौजूद थे। यह विधि एक बार चालू हो जाती है जब श्रोता संलग्न होता है और फिर हर बार बच्चों सहित डेटा बदलता है। ईवेंट कॉलबैक को एक स्नैपशॉट पास किया जाता है जिसमें उस स्थान के सभी डेटा होते हैं, जिसमें चाइल्ड डेटा भी शामिल होता है। अगर वहाँ कोई डाटा नहीं है, स्नैपशॉट वापस आ जाएगी false जब आप कॉल exists() और null जब आप कॉल val() उस पर।

निम्न उदाहरण डेटाबेस से किसी पोस्ट की स्टार काउंट को पुनः प्राप्त करने वाले एक सामाजिक ब्लॉगिंग एप्लिकेशन को प्रदर्शित करता है:

वेब संस्करण 9

import { getDatabase, ref, onValue} from "firebase/database";

const db = getDatabase();
const starCountRef = ref(db, 'posts/' + postId + '/starCount');
onValue(starCountRef, (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

वेब संस्करण 8

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', (snapshot) => {
  const data = snapshot.val();
  updateStarCount(postElement, data);
});

श्रोता एक प्राप्त करता snapshot है कि घटना के समय डेटाबेस में निर्दिष्ट स्थान पर डेटा है। आप में डेटा पुनः प्राप्त कर सकते हैं snapshot साथ val() विधि।

एक बार डेटा पढ़ें

प्राप्त करने के साथ एक बार डेटा पढ़ें ()

एसडीके को डेटाबेस सर्वर के साथ बातचीत को प्रबंधित करने के लिए डिज़ाइन किया गया है, चाहे आपका ऐप ऑनलाइन हो या ऑफलाइन।

आम तौर पर, आपको बैकएंड से डेटा के अपडेट की सूचना प्राप्त करने के लिए डेटा पढ़ने के लिए ऊपर वर्णित वैल्यू इवेंट तकनीकों का उपयोग करना चाहिए। श्रोता तकनीकें आपके उपयोग और बिलिंग को कम करती हैं, और आपके उपयोगकर्ताओं को ऑनलाइन और ऑफलाइन होने पर सर्वोत्तम अनुभव देने के लिए अनुकूलित की जाती हैं।

आप केवल एक बार डेटा की जरूरत है, तो आप उपयोग कर सकते हैं get() डेटाबेस से डेटा का एक स्नैपशॉट प्राप्त करने के लिए। यदि किसी भी कारण से get() सर्वर मूल्य वापस करने में असमर्थ है, ग्राहक स्थानीय भंडारण कैश की जांच और एक त्रुटि लौट यदि मूल्य अभी भी नहीं मिला है होगा।

के अनावश्यक उपयोग get() प्रदर्शन की हानि, जो के रूप में ऊपर दिखाए गए एक वास्तविक समय श्रोता का उपयोग करके रोका जा सकता है के लिए बैंडविड्थ और नेतृत्व के उपयोग बढ़ा सकते हैं।

वेब संस्करण 9

import { getDatabase, ref, child, get } from "firebase/database";

const dbRef = ref(getDatabase());
get(child(dbRef, `users/${userId}`)).then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

वेब संस्करण 8

const dbRef = firebase.database().ref();
dbRef.child("users").child(userId).get().then((snapshot) => {
  if (snapshot.exists()) {
    console.log(snapshot.val());
  } else {
    console.log("No data available");
  }
}).catch((error) => {
  console.error(error);
});

एक बार पर्यवेक्षक के साथ डेटा पढ़ें

कुछ मामलों में आप चाहते हैं कि सर्वर पर अद्यतन मान की जाँच करने के बजाय स्थानीय कैश से मान तुरंत लौटाया जाए। उन मामलों में आप उपयोग कर सकते हैं once() तुरंत स्थानीय डिस्क कैश से डेटा प्राप्त करने।

यह डेटा के लिए उपयोगी है जिसे केवल एक बार लोड करने की आवश्यकता होती है और जिसके बार-बार बदलने या सक्रिय सुनने की आवश्यकता नहीं होती है। उदाहरण के लिए, पिछले उदाहरणों में ब्लॉगिंग ऐप इस पद्धति का उपयोग उपयोगकर्ता के प्रोफ़ाइल को लोड करने के लिए करता है जब वे एक नया पोस्ट लिखना शुरू करते हैं:

वेब संस्करण 9

import { getDatabase, ref, onValue } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const userId = auth.currentUser.uid;
return onValue(ref(db, '/users/' + userId), (snapshot) => {
  const username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
}, {
  onlyOnce: true
});

वेब संस्करण 8

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then((snapshot) => {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

डेटा अपडेट करना या हटाना

विशिष्ट फ़ील्ड अपडेट करें

इसके साथ ही अन्य बच्चे नोड्स अधिलेखन के बिना एक नोड के विशिष्ट बच्चों को लिखने के लिए, का उपयोग करें update() विधि।

जब बुला update() , आप कुंजी के लिए एक पथ निर्दिष्ट द्वारा निचले स्तर बच्चा मान अपडेट कर सकते हैं। डेटा के कई स्थानों में संग्रहीत है, तो बेहतर पैमाने पर करने के लिए, आप का उपयोग कर कि डेटा के सभी उदाहरणों को अपडेट कर सकते डेटा प्रशंसक बाहर

उदाहरण के लिए, एक सोशल ब्लॉगिंग ऐप एक पोस्ट बना सकता है और साथ ही इसे हाल की गतिविधि फ़ीड और पोस्टिंग उपयोगकर्ता की गतिविधि फ़ीड में इस तरह के कोड का उपयोग करके अपडेट कर सकता है:

वेब संस्करण 9

function writeNewPost(uid, username, picture, title, body) {
  const db = getDatabase();

  // A post entry.
  const postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  const newPostKey = push(child(ref(db), 'posts')).key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  const updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return update(ref(db), updates);
}

वेब संस्करण 8

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

इस उदाहरण का उपयोग करता है push() में सभी उपयोगकर्ताओं के लिए पदों युक्त नोड में एक पोस्ट बनाने के लिए /posts/$postid और साथ ही साथ कुंजी को पुनः प्राप्त। कुंजी तो कम से प्रयोक्ता के पोस्ट में एक दूसरे प्रविष्टि बनाने के लिए इस्तेमाल किया जा सकता /user-posts/$userid/$postid

इन रास्तों का उपयोग करके आप JSON पेड़ में कई स्थानों के लिए एक साथ अपडेट एक कॉल के साथ करने के लिए प्रदर्शन कर सकते हैं update() इस तरह कैसे इस उदाहरण दोनों स्थानों में नई पोस्ट बनाता है के रूप में,। इस तरह से किए गए एक साथ अपडेट परमाणु हैं: या तो सभी अपडेट सफल होते हैं या सभी अपडेट विफल हो जाते हैं।

एक पूर्ण कॉलबैक जोड़ें

यदि आप जानना चाहते हैं कि आपका डेटा कब प्रतिबद्ध किया गया है, तो आप एक पूर्ण कॉलबैक जोड़ सकते हैं। दोनों set() और update() एक वैकल्पिक पूरा होने कॉलबैक जब लिखने डेटाबेस के लिए प्रतिबद्ध किया गया है कहा जाता है कि ले। यदि कॉल असफल रही, तो कॉलबैक को एक त्रुटि ऑब्जेक्ट पास किया जाता है जो दर्शाता है कि विफलता क्यों हुई।

वेब संस्करण 9

import { getDatabase, ref, set } from "firebase/database";

const db = getDatabase();
set(ref(db, 'users/' + userId), {
  username: name,
  email: email,
  profile_picture : imageUrl
})
.then(() => {
  // Data saved successfully!
})
.catch((error) => {
  // The write failed...
});

वेब संस्करण 8

firebase.database().ref('users/' + userId).set({
  username: name,
  email: email,
  profile_picture : imageUrl
}, (error) => {
  if (error) {
    // The write failed...
  } else {
    // Data saved successfully!
  }
});

डेटा हटाएं

हटाने के आंकड़ों के सबसे आसान तरीका है फोन करने के लिए है remove() कि डेटा के स्थान के लिए एक संदर्भ पर।

आप यह भी निर्दिष्ट करने के द्वारा नष्ट कर सकते हैं null जैसे एक और लिखने आपरेशन के लिए मूल्य के रूप में set() या update() । आप के साथ इस तकनीक का उपयोग कर सकते हैं update() एक एकल API कॉल में एक से अधिक बच्चों को हटाने के लिए।

एक प्राप्त Promise

पता करने के लिए जब अपने डेटा Firebase रीयलटाइम डेटाबेस सर्वर के लिए प्रतिबद्ध है, तो आप एक का उपयोग कर सकते Promise । दोनों set() और update() एक लौट सकते हैं Promise आप को पता है जब लिखने डेटाबेस के लिए प्रतिबद्ध है उपयोग कर सकते हैं।

श्रोताओं को अलग करें

कॉलबैक फोन करके निकाल दिए जाते हैं off() अपने Firebase डेटाबेस संदर्भ पर विधि।

आप के लिए एक पैरामीटर के रूप में यह पारित करके एक भी श्रोता को हटा सकते हैं off() कॉलिंग off() कोई तर्क के साथ स्थान पर उस स्थान पर सभी श्रोताओं को हटा।

कॉलिंग off() एक माता पिता श्रोता स्वचालित रूप से अपने बच्चे नोड्स पर पंजीकृत श्रोताओं को दूर नहीं करता पर; off() भी किसी भी बच्चे को श्रोताओं पर बुलाया जाना चाहिए कॉलबैक दूर करने के लिए।

डेटा को लेनदेन के रूप में सहेजें

जब डेटा है कि इस तरह वृद्धिशील काउंटर के रूप में समवर्ती संशोधनों से भ्रष्ट हो सकता है के साथ काम करने के लिए, आप एक का उपयोग कर सकते लेनदेन आपरेशन । आप इस ऑपरेशन को एक अपडेट फ़ंक्शन और एक वैकल्पिक समापन कॉलबैक दे सकते हैं। अद्यतन फ़ंक्शन डेटा की वर्तमान स्थिति को एक तर्क के रूप में लेता है और नई वांछित स्थिति देता है जिसे आप लिखना चाहते हैं। यदि आपका नया मान सफलतापूर्वक लिखे जाने से पहले कोई अन्य क्लाइंट स्थान पर लिखता है, तो आपके अपडेट फ़ंक्शन को नए वर्तमान मान के साथ फिर से कॉल किया जाता है, और लिखने का पुन: प्रयास किया जाता है।

उदाहरण के लिए, उदाहरण के लिए सोशल ब्लॉगिंग ऐप में, आप उपयोगकर्ताओं को पोस्ट को तारांकित और अतारांकित करने की अनुमति दे सकते हैं और यह ट्रैक कर सकते हैं कि किसी पोस्ट को कितने सितारे मिले हैं:

वेब संस्करण 9

import { getDatabase, ref, runTransaction } from "firebase/database";

function toggleStar(uid) {
  const db = getDatabase();
  const postRef = ref(db, '/posts/foo-bar-123');

  runTransaction(postRef, (post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

वेब संस्करण 8

function toggleStar(postRef, uid) {
  postRef.transaction((post) => {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

यदि एक से अधिक उपयोगकर्ता एक ही समय में एक ही पोस्ट को तारांकित करते हैं या क्लाइंट के पास पुराना डेटा होता है, तो लेन-देन का उपयोग करना स्टार काउंट को गलत होने से रोकता है। यदि लेन-देन अस्वीकार कर दिया जाता है, तो सर्वर क्लाइंट को वर्तमान मान लौटाता है, जो अद्यतन मूल्य के साथ लेनदेन को फिर से चलाता है। यह तब तक दोहराया जाता है जब तक कि लेन-देन स्वीकार नहीं हो जाता या आप लेन-देन को रोक नहीं देते।

परमाणु सर्वर-साइड वेतन वृद्धि

उपरोक्त उपयोग के मामले में हम डेटाबेस में दो मान लिख रहे हैं: उपयोगकर्ता की आईडी जो पोस्ट को तारांकित/अतारांकित करता है, और बढ़ी हुई स्टार गिनती। यदि हम पहले से ही जानते हैं कि उपयोगकर्ता पोस्ट को तारांकित कर रहा है, तो हम लेनदेन के बजाय परमाणु वृद्धि संचालन का उपयोग कर सकते हैं।

function addStar(uid, key) {
  const updates = {};
  updates[`posts/${key}/stars/${uid}`] = true;
  updates[`posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  updates[`user-posts/${key}/stars/${uid}`] = true;
  updates[`user-posts/${key}/starCount`] = firebase.database.ServerValue.increment(1);
  firebase.database().ref().update(updates);
}

यह कोड लेन-देन संचालन का उपयोग नहीं करता है, इसलिए यदि कोई विरोधाभासी अद्यतन है तो यह स्वचालित रूप से फिर से नहीं चलता है। हालांकि, चूंकि इंक्रीमेंट ऑपरेशन सीधे डेटाबेस सर्वर पर होता है, इसलिए विरोध की कोई संभावना नहीं है।

यदि आप एप्लिकेशन-विशिष्ट विरोधों का पता लगाना और अस्वीकार करना चाहते हैं, जैसे कि कोई उपयोगकर्ता किसी पोस्ट को अभिनीत करता है जिसे उन्होंने पहले ही तारांकित किया है, तो आपको उस उपयोग के मामले के लिए कस्टम सुरक्षा नियम लिखना चाहिए।

डेटा के साथ ऑफ़लाइन काम करें

यदि कोई क्लाइंट अपना नेटवर्क कनेक्शन खो देता है, तो आपका ऐप ठीक से काम करना जारी रखेगा।

फायरबेस डेटाबेस से जुड़ा प्रत्येक क्लाइंट किसी भी सक्रिय डेटा का अपना आंतरिक संस्करण रखता है। जब डेटा लिखा जाता है, तो इसे पहले इस स्थानीय संस्करण में लिखा जाता है। फायरबेस क्लाइंट तब उस डेटा को दूरस्थ डेटाबेस सर्वर और अन्य क्लाइंट के साथ "सर्वोत्तम-प्रयास" के आधार पर सिंक्रनाइज़ करता है।

नतीजतन, सर्वर पर कोई भी डेटा लिखे जाने से पहले, सभी डेटाबेस को लिखते हैं, स्थानीय घटनाओं को तुरंत ट्रिगर करते हैं। इसका मतलब है कि नेटवर्क विलंबता या कनेक्टिविटी की परवाह किए बिना आपका ऐप उत्तरदायी रहता है।

एक बार कनेक्टिविटी फिर से स्थापित हो जाने के बाद, आपका ऐप ईवेंट का उपयुक्त सेट प्राप्त करता है ताकि क्लाइंट बिना कोई कस्टम कोड लिखे, वर्तमान सर्वर स्थिति के साथ सिंक हो जाए।

हम में ऑफ़लाइन व्यवहार के बारे में अधिक बात करेंगे और जानें के बारे में ऑनलाइन और ऑफलाइन क्षमताओं ..

अगले कदम