अपने ऐप्लिकेशन को Cloud Firestore Emulator से कनेक्ट करें

अपने ऐप्लिकेशन को Cloud Firestore एम्युलेटर से कनेक्ट करने से पहले, पक्का करें कि आपको पूरे Firebase Local Emulator Suite वर्कफ़्लोके बारे में पता हो . साथ ही, आपने इंस्टॉल और कॉन्फ़िगर किया हो Local Emulator Suite. इसके अलावा, आपने इसके सीएलआई कमांडकी समीक्षा की हो.

कोई Firebase प्रोजेक्ट चुनें

Firebase Local Emulator Suite एक Firebase प्रोजेक्ट के लिए प्रॉडक्ट की नकल करता है.

इस्तेमाल करने के लिए प्रोजेक्ट चुनने के लिए, एम्युलेटर शुरू करने से पहले, अपनी वर्किंग डायरेक्ट्री में सीएलआई में firebase use चलाएं. इसके अलावा, हर एम्युलेटर कमांड में --project फ़्लैग पास किया जा सकता है.

Local Emulator Suite असली Firebase प्रोजेक्ट और डेमो प्रोजेक्ट की नकल करने की सुविधा देता है.

प्रोजेक्ट का टाइप सुविधाएं एम्युलेटर के साथ इस्तेमाल करना
असली

असली Firebase प्रोजेक्ट वह होता है जिसे आपने बनाया और कॉन्फ़िगर किया है. आम तौर पर, इसे Firebase कंसोल के ज़रिए बनाया और कॉन्फ़िगर किया जाता है.

असली प्रोजेक्ट में लाइव रिसॉर्स होते हैं. जैसे, डेटाबेस इंस्टेंस, स्टोरेज बकेट, फ़ंक्शन या कोई अन्य रिसॉर्स जिसे आपने उस Firebase प्रोजेक्ट के लिए सेट अप किया है.

असली Firebase प्रोजेक्ट के साथ काम करते समय, आपके पास सपोर्ट करने वाले किसी भी या सभी प्रॉडक्ट के लिए एम्युलेटर चलाने का विकल्प होता है.

जिन प्रॉडक्ट के लिए एम्युलेटर नहीं चलाया जा रहा है उनके लिए, आपके ऐप्लिकेशन और कोड, लाइव रिसॉर्स (डेटाबेस इंस्टेंस, स्टोरेज बकेट, फ़ंक्शन वगैरह) के साथ इंटरैक्ट करेंगे.

डेमो

डेमो Firebase प्रोजेक्ट में, असली Firebase कॉन्फ़िगरेशन और लाइव रिसॉर्स नहीं होते. आम तौर पर, इन प्रोजेक्ट को कोडलैब या अन्य ट्यूटोरियल के ज़रिए ऐक्सेस किया जाता है.

डेमो प्रोजेक्ट के प्रोजेक्ट आईडी में demo- प्रीफ़िक्स होता है.

डेमो Firebase प्रोजेक्ट के साथ काम करते समय, आपके ऐप्लिकेशन और कोड एम्युलेटर सिर्फ़ के साथ इंटरैक्ट करते हैं. अगर आपका ऐप्लिकेशन किसी ऐसे रिसॉर्स के साथ इंटरैक्ट करने की कोशिश करता है जिसके लिए एम्युलेटर नहीं चल रहा है, तो वह कोड काम नहीं करेगा.

हमारा सुझाव है कि जहां भी मुमकिन हो, डेमो प्रोजेक्ट का इस्तेमाल करें. इसके फ़ायदे यहां दिए गए हैं:

  • सेटअप करना आसान है, क्योंकि Firebase प्रोजेक्ट बनाए बिना एम्युलेटर चलाए जा सकते हैं
  • सुरक्षा बेहतर होती है, क्योंकि अगर आपका कोड गलती से ऐसे रिसॉर्स को शुरू करता है जिनके लिए एम्युलेटर नहीं चल रहा है (प्रोडक्शन), तो डेटा में बदलाव, इस्तेमाल, और बिलिंग की कोई संभावना नहीं होती
  • ऑफ़लाइन सहायता बेहतर होती है, क्योंकि एसडीके कॉन्फ़िगरेशन डाउनलोड करने के लिए इंटरनेट ऐक्सेस करने की ज़रूरत नहीं होती.

एम्युलेटर के साथ इंटरैक्ट करने के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करें

शुरू होने पर, Cloud Firestore एम्युलेटर, डिफ़ॉल्ट डेटाबेस और नाम वाला डेटाबेस बनाता है. यह डेटाबेस, आपकी firebase.json फ़ाइल में मौजूद हर firestore कॉन्फ़िगरेशन के लिए होता है.

नाम वाले डेटाबेस, किसी खास डेटाबेस का रेफ़रंस देने वाले एसडीके या REST API कॉल के जवाब में भी अपने-आप बन जाते हैं. अपने-आप बनने वाले ऐसे डेटाबेस, ओपन नियमों के साथ काम करते हैं.

Emulator Suite यूज़र इंटरफ़ेस (यूआई) मेंEmulator Suite UI, डिफ़ॉल्ट और नाम वाले डेटाबेस के साथ इंटरैक्टिव तरीके से काम करने के लिए, अपने ब्राउज़र के पता बार में, डिफ़ॉल्ट या नाम वाला डेटाबेस चुनने के लिए यूआरएल अपडेट करें.

  • उदाहरण के लिए, अपने डिफ़ॉल्ट इंस्टेंस में डेटा ब्राउज़ करने के लिए, यूआरएल को localhost:4000/firestore/default/data पर अपडेट करें
  • ecommerce नाम के इंस्टेंस में ब्राउज़ करने के लिए, इसे localhost:4000/firestore/ecommerce/data पर अपडेट करें.

एम्युलेटर को किसी खास वर्शन में शुरू करना

एम्युलेटर, आपकी firebase.json फ़ाइल के firestore.edition सेक्शन में बताए गए वर्शन में शुरू होगा. आपके पास, firebase.json के emulators.firestore.edition सेक्शन में कोई वर्शन बताने का विकल्प भी है. वर्शन के लिए मान्य वैल्यू, standard और enterprise हैं. अगर दोनों कॉन्फ़िगरेशन में edition की जानकारी दी जाती है, तो emulators.firestore.edition को प्राथमिकता दी जाती है.

    {
      ...
      "firestore": {
        "rules": "firestore.rules",
        "indexes": "firestore.indexes.json",
        "edition": "enterprise"
      },
      "emulators": {
        "firestore": {
          "port": 8080,
          "edition": "enterprise" // Takes precedence over `firestore.edition`
        }
      },
      ...
    }

Android, Apple प्लैटफ़ॉर्म, और वेब एसडीके

Cloud FirestoreCloud Firestore के साथ इंटरैक्ट करने के लिए, अपने इन-ऐप्लिकेशन कॉन्फ़िगरेशन या टेस्ट क्लास को इस तरह सेट अप करें. ध्यान दें कि यहां दिए गए सैंपल में, ऐप्लिकेशन कोड, डिफ़ॉल्ट प्रोजेक्ट डेटाबेस से कनेक्ट हो रहा है. डिफ़ॉल्ट डेटाबेस के अलावा, अन्य Cloud Firestore डेटाबेस से जुड़े उदाहरणों के लिए, एक से ज़्यादा डेटाबेस के लिए बनी गाइड देखें.

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val firestore = Firebase.firestore
firestore.useEmulator("10.0.2.2", 8080)

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings
Unity
FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
// Connects to the Firestore Emulator running on port 8080
db.Settings.Host = "127.0.0.1:8080";
db.Settings.SslEnabled = false;

Web

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

एम्युलेटर का इस्तेमाल करके, Firestore इवेंट से ट्रिगर होने वाले Cloud Functions की जांच करने के लिए , किसी अन्य सेटअप की ज़रूरत नहीं होती. Firestore और Cloud Functions, दोनों के एम्युलेटर चलने पर, वे अपने-आप एक साथ काम करते हैं.

Admin SDKs

Firebase Admin SDKs एनवायरमेंट वैरिएबल सेट होने पर, Cloud Firestore एम्युलेटर अपने-आप कनेक्ट हो जाते हैंFIRESTORE_EMULATOR_HOST:

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

अगर आपका कोड, Cloud Functions एम्युलेटर के अंदर चल रहा है, तो आपका प्रोजेक्ट आईडी और अन्य कॉन्फ़िगरेशन, initializeApp को कॉल करने पर अपने-आप सेट हो जाते हैं.

अगर आपको Admin SDK कोड को किसी दूसरे एनवायरमेंट में चल रहे शेयर किए गए एम्युलेटर से कनेक्ट करना है, तो आपको वही प्रोजेक्ट आईडी बताना होगा जिसे आपने Firebase सीएलआई का इस्तेमाल करके सेट किया है. initializeApp में सीधे प्रोजेक्ट आईडी पास किया जा सकता है या GCLOUD_PROJECT एनवायरमेंट वैरिएबल सेट किया जा सकता है.

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
एनवायरमेंट वैरिएबल
export GCLOUD_PROJECT="your-project-id"

Cloud Firestore REST API

Cloud Firestore एम्युलेटर, आपके डेटाबेस के साथ इंटरैक्ट करने के लिए REST एंडपॉइंट उपलब्ध कराता है. REST API के सभी कॉल, http://localhost:8080/v1 एंडपॉइंट पर किए जाने चाहिए.

REST कॉल के लिए पूरा पाथ, इस पैटर्न के मुताबिक होता है:

http://localhost:8080/v1/projects/{project_id}/databases/{database_id}/documents/{document_path}

उदाहरण के लिए, my-project-id प्रोजेक्ट के लिए, users कलेक्शन में मौजूद सभी दस्तावेज़ों की सूची बनाने के लिए, curl का इस्तेमाल किया जा सकता है:

curl -X GET "http://localhost:8080/v1/projects/my-project-id/databases/(default)/documents/users"

टेस्ट के बीच, अपना डेटाबेस साफ़ करें

प्रोडक्शन Firestore, डेटाबेस को फ़्लश करने के लिए कोई प्लैटफ़ॉर्म एसडीके तरीका उपलब्ध नहीं कराता.हालांकि, Firestore एम्युलेटर, खास तौर पर इस काम के लिए REST एंडपॉइंट उपलब्ध कराता है. इसे टेस्ट फ़्रेमवर्क सेटअप/tearDown स्टेप, टेस्ट क्लास या शेल (उदाहरण के लिए, curl के साथ) से, टेस्ट शुरू होने से पहले कॉल किया जा सकता है. इस तरीके का इस्तेमाल, एम्युलेटर प्रोसेस को बंद करने के बजाय किया जा सकता है.

किसी सही तरीके में, एचटीटीपी DELETE ऑपरेशन करें. इसके लिए, अपना Firebase प्रोजेक्ट आईडी दें. उदाहरण के लिए, firestore-emulator-example को इस एंडपॉइंट पर दें:

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

ज़ाहिर है कि आपके कोड को, फ़्लश पूरा होने या फ़ेल होने की REST पुष्टि का इंतज़ार करना चाहिए.

यह ऑपरेशन शेल से किया जा सकता है:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

इस तरह का कोई स्टेप लागू करने के बाद, अपने टेस्ट को क्रम से चलाया जा सकता है और अपने फ़ंक्शन को ट्रिगर किया जा सकता है. इससे आपको यह भरोसा रहेगा कि रन के बीच पुराना डेटा मिटा दिया जाएगा और आप नए बेसलाइन टेस्ट कॉन्फ़िगरेशन का इस्तेमाल कर रहे हैं.

डेटा इंपोर्ट और एक्सपोर्ट करना

डेटाबेस और Cloud Storage for Firebase एम्युलेटर की मदद से, चालू एम्युलेटर इंस्टेंस से डेटा एक्सपोर्ट किया जा सकता है. यूनिट टेस्ट या लगातार इंटिग्रेशन वर्कफ़्लो में इस्तेमाल करने के लिए, डेटा का बेसलाइन सेट तय करें. इसके बाद, इसे टीम के साथ शेयर करने के लिए एक्सपोर्ट करें.

firebase emulators:export ./dir

टेस्ट में, एम्युलेटर शुरू होने पर, बेसलाइन डेटा इंपोर्ट करें.

firebase emulators:start --import=./dir

एम्युलेटर को बंद होने पर डेटा एक्सपोर्ट करने का निर्देश दिया जा सकता है. इसके लिए, एक्सपोर्ट पाथ तय किया जा सकता है या सिर्फ़ --import फ़्लैग में पास किए गए पाथ का इस्तेमाल किया जा सकता है.

firebase emulators:start --import=./dir --export-on-exit

डेटा इंपोर्ट और एक्सपोर्ट करने के ये विकल्प, firebase emulators:exec कमांड के साथ भी काम करते हैं. ज़्यादा जानकारी के लिए, एम्युलेटर कमांड रेफ़रंस देखें.

सुरक्षा नियमों से जुड़ी गतिविधि को विज़ुअलाइज़ करना

प्रोटोटाइप और टेस्ट लूप के दौरान, विज़ुअलाइज़ेशन टूल और Local Emulator Suite से मिली रिपोर्ट का इस्तेमाल किया जा सकता है.

अनुरोध मॉनिटर का इस्तेमाल करना

Cloud Firestore एम्युलेटर की मदद से, Emulator Suite UI में क्लाइंट के अनुरोधों को विज़ुअलाइज़ किया जा सकता है. इसमें Firebase Security Rules के लिए, आकलन की ट्रेसिंग भी शामिल है.

हर अनुरोध के लिए, आकलन का सिलसिलेवार तरीका देखने के लिए, Firestore > अनुरोध टैब खोलें.

Firestore Emulator Requests Monitor में, सुरक्षा के नियमों के आकलन को दिखाया गया है

नियमों के आकलन की रिपोर्ट को विज़ुअलाइज़ करना

प्रोटोटाइप में सुरक्षा नियम जोड़ने के दौरान, उन्हें Local Emulator Suite डीबग टूल की मदद से डीबग किया जा सकता है.

टेस्ट का सुइट चलाने के बाद, टेस्ट कवरेज रिपोर्ट ऐक्सेस की जा सकती हैं. इनमें यह दिखाया जाता है कि आपके हर सुरक्षा नियम का आकलन कैसे किया गया.

रिपोर्ट पाने के लिए, एम्युलेटर के चालू होने के दौरान, उसके किसी ऐसे एंडपॉइंट के लिए क्वेरी करें जिसे सार्वजनिक किया गया है. ब्राउज़र के साथ काम करने वाले वर्शन के लिए, यह यूआरएल इस्तेमाल करें:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

इससे आपके नियमों को एक्सप्रेशन और सब-एक्सप्रेशन में बांटा जाता है. इन पर कर्सर ले जाकर, ज़्यादा जानकारी देखी जा सकती है. इसमें आकलन की संख्या और दिखाई गई वैल्यू शामिल हैं. इस डेटा के रॉ JSON वर्शन के लिए, अपनी क्वेरी में यह यूआरएल शामिल करें:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

यहां, रिपोर्ट के एचटीएमएल वर्शन में, उन आकलनों को हाइलाइट किया गया है जिनमें अनडिफ़ाइंड और नल-वैल्यू से जुड़ी गड़बड़ियां हैं:

Cloud Firestore एम्युलेटर, प्रोडक्शन से कैसे अलग है

Cloud Firestore एम्युलेटर, प्रोडक्शन सेवा के व्यवहार को सटीक तरीके से दोहराने की कोशिश करता है. हालांकि, इसमें कुछ अहम सीमाएं हैं.

Cloud Firestore के लिए एक से ज़्यादा डेटाबेस की सुविधा

फ़िलहाल, Emulator Suite UI डिफ़ॉल्ट डेटाबेस के लिए इंटरैक्टिव तरीके से बनाने, बदलाव करने, मिटाने, अनुरोध की निगरानी करने, और सुरक्षा को विज़ुअलाइज़ करने की सुविधा देता है. हालांकि, यह नाम वाले अन्य डेटाबेस के लिए यह सुविधा नहीं देता.

हालांकि, एम्युलेटर खुद ही firebase.json फ़ाइल में मौजूद कॉन्फ़िगरेशन के आधार पर और एसडीके या REST API कॉल के जवाब में, नाम वाला डेटाबेस बनाता है.

लेन-देन

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

इंडेक्स

एम्युलेटर, कंपोज़िट इंडेक्स को ट्रैक नहीं करता. इसके बजाय, यह किसी भी मान्य क्वेरी को एक्ज़ीक्यूट करेगा. यह पता करने के लिए कि आपको किन इंडेक्स की ज़रूरत होगी, अपने ऐप्लिकेशन की जांच, असली Cloud Firestore इंस्टेंस के ख़िलाफ़ करें.

सीमाएं

एम्युलेटर, प्रोडक्शन में लागू की गई सभी सीमाओं को लागू नहीं करता. उदाहरण के लिए, एम्युलेटर, ऐसे लेन-देन की अनुमति दे सकता है जिन्हें प्रोडक्शन सेवा, बहुत बड़े होने की वजह से अस्वीकार कर देगी. पक्का करें कि आपको दस्तावेज़ में बताई गई सीमाओं के बारे में पता हो और आपने अपने ऐप्लिकेशन को इस तरह डिज़ाइन किया हो कि इन सीमाओं का उल्लंघन न हो.

आगे क्या करना है?