अपने ऐप्लिकेशन को 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 Firestore के साथ इंटरैक्ट करने के लिए, अपने इन-ऐप्लिकेशन कॉन्फ़िगरेशन या टेस्ट क्लास को इस तरह सेट अप करें.Cloud 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

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.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 इंस्टेंस के ख़िलाफ़ करें.

सीमाएं

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

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