अपने ऐप्लिकेशन को Cloud Functions एम्युलेटर से कनेक्ट करें

अपने ऐप्लिकेशन को Cloud Functions एम्युलेटर से कनेक्ट करने से पहले, पक्का करें कि आपको पूरे 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 Functions for Firebase एम्युलेटर के साथ इंटरैक्शन को इस तरह कॉन्फ़िगर करें:

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useEmulator(withHost: "localhost", port: 5001)

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

एचटीटीपीएस फ़ंक्शन एम्युलेशन के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करना

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

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

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

https://localhost:5001/$PROJECT/us-central1/helloWorld

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

एम्युलेटर, ट्रिगर की परिभाषाओं के आधार पर, एम्युलेट किए गए टास्क क्यू को अपने-आप सेट अप करता है. साथ ही, Admin SDK, क्यू में शामिल किए गए अनुरोधों को एम्युलेटर पर रीडायरेक्ट करता है. ऐसा तब होता है, जब उसे पता चलता है कि यह CLOUD_TASKS_EMULATOR_HOST एनवायरमेंट वैरिएबल के ज़रिए चल रहा है.

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

बैकग्राउंड से ट्रिगर होने वाले फ़ंक्शन एम्युलेशन के लिए, अपने ऐप्लिकेशन को इंस्ट्रूमेंट करना

Cloud Functions एम्युलेटर, इन सोर्स से बैकग्राउंड से ट्रिगर होने वाले फ़ंक्शन को सपोर्ट करता है:

  • Realtime Database एम्युलेटर
  • Cloud Firestore एम्युलेटर
  • Authentication एम्युलेटर
  • Pub/Sub एम्युलेटर
  • Firebase चेतावनियों का एम्युलेटर

बैकग्राउंड इवेंट को ट्रिगर करने के लिए, Emulator Suite UI का इस्तेमाल करके, बैक-एंड संसाधनों में बदलाव करें. इसके अलावा, अपने प्लैटफ़ॉर्म के लिए एसडीके का इस्तेमाल करके, अपने ऐप्लिकेशन या टेस्ट कोड को एम्युलेटर से कनेक्ट करें.

एक्सटेंशन से जनरेट होने वाले कस्टम इवेंट के लिए, हैंडलर की जांच करना

Cloud Functions v2 की मदद से, Firebase एक्सटेंशन के कस्टम इवेंट को हैंडल करने के लिए लागू किए गए फ़ंक्शन के लिए, Cloud Functions एम्युलेटर, Eventarc ट्रिगर को सपोर्ट करने के लिए, Eventarc एम्युलेटर के साथ काम करता है.Firebase ExtensionsCloud FunctionsCloud Functions

एक्सटेंशन के कस्टम इवेंट हैंडलर की जांच करने के लिए, आपको Cloud Functions और Eventarc एम्युलेटर इंस्टॉल करने होंगे.

अगर Eventarc एम्युलेटर चल रहा है, तो Cloud Functions रनटाइम, मौजूदा प्रोसेस में EVENTARC_EMULATOR एनवायरमेंट वैरिएबल को localhost:9299 पर सेट करता है. Firebase Admin SDKs एनवायरमेंट वैरिएबल सेट होने पर, Eventarc एम्युलेटर अपने-आप EVENTARC_EMULATOR से कनेक्ट हो जाते हैं. डिफ़ॉल्ट पोर्ट में बदलाव करने के बारे में जानकारी, Configure Local Emulator Suite में दी गई है.

एनवायरमेंट वैरिएबल सही तरीके से कॉन्फ़िगर होने पर, Firebase Admin SDK अपने-आप इवेंट को Eventarc एम्युलेटर पर भेजता है. इसके बाद, Eventarc एम्युलेटर, रजिस्टर किए गए किसी भी हैंडलर को ट्रिगर करने के लिए, Cloud Functions एम्युलेटर को वापस कॉल करता है.

हैंडलर के एक्ज़ीक्यूशन के बारे में जानकारी पाने के लिए, Emulator Suite UI में, फ़ंक्शन के लॉग देखें.

स्थानीय टेस्टिंग एनवायरमेंट कॉन्फ़िगर करना

अगर आपके फ़ंक्शन, dotenv पर आधारित एनवायरमेंट कॉन्फ़िगरेशनपर निर्भर करते हैं, तो अपने स्थानीय टेस्टिंग एनवायरमेंट में उस व्यवहार को एम्युलेट किया जा सकता है.

स्थानीय Cloud Functions एम्युलेटर का इस्तेमाल करते समय, .env.local फ़ाइल सेट अप करके, अपने प्रोजेक्ट के लिए एनवायरमेंट वैरिएबल को बदला जा सकता है. .env.local में मौजूद कॉन्टेंट को .env और प्रोजेक्ट के लिए खास .env फ़ाइल के मुकाबले प्राथमिकता दी जाती है.

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

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

स्थानीय कॉन्टेक्स्ट में शुरू होने पर, एम्युलेटर, एनवायरमेंट वैरिएबल को इस तरह लोड करता है:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Cloud Functions एम्युलेटर में सीक्रेट और क्रेडेंशियल

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

एनवायरमेंट वैरिएबल के लिए Cloud Functions एम्युलेटर के सपोर्ट की तरह, फ़ाइल सेट अप करके, सीक्रेट की वैल्यू को बदला जा सकता है..secret.local इससे, स्थानीय तौर पर अपने फ़ंक्शन की जांच करना आसान हो जाता है. खास तौर पर, तब जब आपके पास सीक्रेट की वैल्यू का ऐक्सेस न हो.

जांच करने के लिए, और कौनसे टूल Cloud Functions मौजूद हैं?

Cloud Functions एम्युलेटर के साथ, प्रोटोटाइप और टेस्ट के लिए अन्य टूल भी उपलब्ध हैं:

  • Cloud Functions शेल. इसकी मदद से, फ़ंक्शन के प्रोटोटाइप और डेवलपमेंट को इंटरैक्टिव और बार-बार किया जा सकता है. शेल, डेवलपमेंट के लिए REPL-स्टाइल इंटरफ़ेस के साथ Cloud Functions एम्युलेटर का इस्तेमाल करता है. Cloud Firestore या Realtime Database एम्युलेटर के साथ इंटिग्रेशन की सुविधा उपलब्ध नहीं है. शेल का इस्तेमाल करके, डेटा को मॉक किया जा सकता है. साथ ही, फ़ंक्शन कॉल करके, उन प्रॉडक्ट के साथ इंटरैक्शन को सिम्युलेट किया जा सकता है जिन्हें Local Emulator Suite फ़िलहाल सपोर्ट नहीं करता: Analytics, रिमोट कॉन्फ़िगरेशन, और Crashlytics.
  • Cloud Functions के लिए Firebase Test SDK. यह फ़ंक्शन डेवलपमेंट के लिए, mocha फ़्रेमवर्क के साथ Node.js है. असल में, Cloud Functions Test SDK, Cloud Functions शेल के ऊपर ऑटोमेशन की सुविधा देता है.

Cloud Functions शेल और Cloud Functions Test SDK के बारे में ज़्यादा जानने के लिए, इंटरैक्टिव तरीके से फ़ंक्शन की जांच करना और Cloud Functions की यूनिट टेस्टिंग देखें.

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

ज़्यादातर मामलों में, Cloud Functions एम्युलेटर, प्रोडक्शन एनवायरमेंट के काफ़ी करीब होता है. हमने यह पक्का करने के लिए काफ़ी काम किया है कि Node रनटाइम में मौजूद हर चीज़, प्रोडक्शन के जितनी करीब हो सके. हालांकि, एम्युलेटर, पूरी तरह से कंटेनर वाले प्रोडक्शन एनवायरमेंट की नकल नहीं करता. इसलिए, आपका फ़ंक्शन कोड, असल में काम करने जैसा ही होगा. हालांकि, आपके एनवायरमेंट के अन्य पहलू (जैसे, स्थानीय फ़ाइलें, फ़ंक्शन क्रैश होने के बाद का व्यवहार वगैरह) अलग-अलग होंगे.

Cloud IAM

Firebase Emulator Suite, रनटाइम के लिए, IAM से जुड़े किसी भी व्यवहार को दोहराने या उसका पालन करने की कोशिश नहीं करता. एम्युलेटर, Firebase के दिए गए सुरक्षा नियमों का पालन करते हैं. हालांकि, उन स्थितियों में जहां आम तौर पर IAM का इस्तेमाल किया जाता है, जैसे कि Cloud Functions को इनवोक करने वाले सेवा खाते और इस तरह अनुमतियां सेट करने के लिए, एम्युलेटर को कॉन्फ़िगर नहीं किया जा सकता. साथ ही, यह आपके डेवलपर मशीन पर, दुनिया भर में उपलब्ध खाते का इस्तेमाल करेगा. यह ठीक उसी तरह होगा जैसे स्थानीय स्क्रिप्ट को सीधे तौर पर चलाया जाता है.

मेमोरी और प्रोसेसर से जुड़ी पाबंदियां

एम्युलेटर, आपके फ़ंक्शन के लिए मेमोरी या प्रोसेसर से जुड़ी पाबंदियां लागू नहीं करता. हालांकि, एम्युलेटर, timeoutSeconds रनटाइम आर्ग्युमेंट के ज़रिए, फ़ंक्शन के टाइम आउट होने की सुविधा देता है.

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

स्थानीय और प्रोडक्शन एनवायरमेंट में अंतर की योजना बनाना

एम्युलेटर, आपकी स्थानीय मशीन पर चलता है. इसलिए, यह ऐप्लिकेशन, बिल्ट-इन प्रोग्राम, और यूटिलिटी के लिए, आपके स्थानीय एनवायरमेंट पर निर्भर करता है.

ध्यान रखें कि Cloud Functions डेवलपमेंट के लिए आपका स्थानीय एनवायरमेंट, Google के प्रोडक्शन एनवायरमेंट से अलग हो सकता है:

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

  • इसी तरह, बिल्ट-इन यूटिलिटी (जैसे, शेल कमांड, जैसे कि ls, mkdir) के वर्शन, प्रोडक्शन में उपलब्ध वर्शन से अलग हो सकते हैं. खास तौर पर, तब जब आप Linux के अलावा किसी अन्य एनवायरमेंट (जैसे, macOS) में डेवलपमेंट कर रहे हों. इस समस्या को, नेटिव कमांड के लिए, सिर्फ़ Node के विकल्पों का इस्तेमाल करके या अपने डिप्लॉयमेंट के साथ बंडल करने के लिए, Linux बाइनरी बनाकर हल किया जा सकता है.

फिर से प्रयास कर रहा है

Cloud Functions एम्युलेटर, फ़ंक्शन के फ़ेल होने पर, उन्हें फिर से चलाने की सुविधा नहीं देता.

अब क्या करना है?