शुरू करें: अपने पहले फ़ंक्शन लिखें, टेस्ट करें, और डिप्लॉय करें


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

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

हमने इस सैंपल के लिए Cloud Firestore और एचटीटीपी से ट्रिगर होने वाले JavaScript फ़ंक्शन को इसलिए चुना है, क्योंकि Firebase Local Emulator Suite की मदद से, बैकग्राउंड ट्रिगर की पूरी तरह से जांच की जा सकती है. यह टूलसेट, Realtime Database, PubSub, Auth, और एचटीटीपी कॉल करने लायक ट्रिगर के साथ भी काम करता है. Remote Config, TestLab, और Analytics ट्रिगर जैसे बैकग्राउंड ट्रिगर के लिए, इस पेज पर बताए गए टूलसेट का इस्तेमाल करके, इंटरैक्टिव तरीके से टेस्ट किया जा सकता है.

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

Firebase प्रोजेक्ट बनाना

  1. Firebase कंसोल में, प्रोजेक्ट जोड़ें पर क्लिक करें.

    • मौजूदा Google Cloud प्रोजेक्ट में Firebase संसाधन जोड़ने के लिए, प्रोजेक्ट का नाम डालें या ड्रॉपडाउन मेन्यू से चुनें.

    • नया प्रोजेक्ट बनाने के लिए, प्रोजेक्ट का नाम डालें. आपके पास प्रोजेक्ट के नाम के नीचे दिख रहे प्रोजेक्ट आईडी में भी बदलाव करने का विकल्प है. हालांकि, ऐसा करना ज़रूरी नहीं है.

  2. अगर कहा जाए, तो Firebase की शर्तें पढ़ें और उन्हें स्वीकार करें.

  3. जारी रखें पर क्लिक करें.

  4. (ज़रूरी नहीं) अपने प्रोजेक्ट के लिए Google Analytics सेट अप करें. इससे, आपको यहां दिए गए Firebase प्रॉडक्ट में से किसी का भी इस्तेमाल करने का बेहतर अनुभव मिलता है:

    कोई मौजूदा Google Analytics खाता चुनें या नया खाता बनाएं.

    नया खाता बनाने पर, अपनी Analytics रिपोर्टिंग की जगह चुनें. इसके बाद, अपने प्रोजेक्ट के लिए, डेटा शेयर करने की सेटिंग और Google Analytics की शर्तें स्वीकार करें.

  5. प्रोजेक्ट बनाएं पर क्लिक करें. अगर किसी मौजूदा Google Cloud प्रोजेक्ट का इस्तेमाल किया जा रहा है, तो Firebase जोड़ें पर क्लिक करें.

Firebase आपके Firebase प्रोजेक्ट के लिए संसाधन अपने-आप सेट अप करता है. प्रोसेस पूरी होने के बाद, आपको Firebase कंसोल में अपने Firebase प्रोजेक्ट के होम पेज पर ले जाया जाएगा.

Node.js और Firebase CLI सेट अप करना

फ़ंक्शन लिखने के लिए, आपको Node.js एनवायरमेंट की ज़रूरत होगी. साथ ही, Cloud Functions रनटाइम में फ़ंक्शन डिप्लॉय करने के लिए, आपको Firebase सीएलआई की ज़रूरत होगी. Node.js और npm इंस्टॉल करने के लिए, Node Version Manager का इस्तेमाल करने का सुझाव दिया जाता है.

Node.js और npm को इंस्टॉल करने के बाद, अपने पसंदीदा तरीके से Firebase सीएलआई इंस्टॉल करें. npm की मदद से CLI इंस्टॉल करने के लिए, इनका इस्तेमाल करें:

npm install -g firebase-tools

इससे, दुनिया भर में उपलब्ध Firebase कमांड इंस्टॉल हो जाता है. अगर यह निर्देश काम नहीं करता है, तो आपको npm की अनुमतियां बदलनी पड़ सकती हैं. firebase-tools को नए वर्शन में अपडेट करने के लिए, उसी निर्देश को फिर से चलाएं.

अपना प्रोजेक्ट शुरू करना

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

अपना प्रोजेक्ट शुरू करने के लिए:

  1. ब्राउज़र से लॉग इन करने और Firebase के सीएलआई की पुष्टि करने के लिए, firebase login चलाएं.
  2. अपने Firebase प्रोजेक्ट की डायरेक्ट्री पर जाएं.
  3. firebase init firestore चलाएं. इस ट्यूटोरियल के लिए, Firestore के नियमों और इंडेक्स फ़ाइलों के लिए पूछे जाने पर, डिफ़ॉल्ट वैल्यू स्वीकार की जा सकती हैं. अगर आपने अब तक इस प्रोजेक्ट में Cloud Firestore का इस्तेमाल नहीं किया है, तो आपको Firestore के लिए शुरू करने का मोड और जगह भी चुननी होगी. इसके बारे में Cloud Firestore का इस्तेमाल शुरू करना में बताया गया है.
  4. firebase init functions चलाएं. सीएलआई, आपको कोई मौजूदा कोडबेस चुनने या नया कोडबेस शुरू करने और उसका नाम रखने के लिए कहता है. शुरुआत में, डिफ़ॉल्ट जगह पर एक कोडबेस होना ही काफ़ी है. बाद में, जब आपका कोडबेस बड़ा हो जाएगा, तो हो सकता है कि आप कोडबेस में फ़ंक्शन व्यवस्थित करना चाहें.
  5. सीएलआई में, भाषा से जुड़ी सहायता के लिए दो विकल्प मिलते हैं:

    इस ट्यूटोरियल के लिए, JavaScript चुनें.

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

इन निर्देशों के पूरा होने के बाद, आपके प्रोजेक्ट का स्ट्रक्चर कुछ ऐसा दिखेगा:

myproject
 +- .firebaserc    # Hidden file that helps you quickly switch between
 |                 # projects with `firebase use`
 |
 +- firebase.json  # Describes properties for your project
 |
 +- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # main source file for your Cloud Functions code
      |
      +- node_modules/ # directory where your dependencies (declared in
                       # package.json) are installed

शुरू करने के दौरान बनाई गई package.json फ़ाइल में एक अहम कुंजी होती है: "engines": {"node": "16"}. यह फ़ंक्शन लिखने और डिप्लॉय करने के लिए, आपके Node.js वर्शन के बारे में बताता है. आपके पास काम करने वाले अन्य वर्शन चुनने का विकल्प है.

ज़रूरी मॉड्यूल इंपोर्ट करना और ऐप्लिकेशन को शुरू करना

सेटअप के टास्क पूरे करने के बाद, सोर्स डायरेक्ट्री को खोला जा सकता है. साथ ही, यहां दिए गए सेक्शन में बताए गए तरीके से कोड जोड़ा जा सकता है. इस सैंपल के लिए, आपके प्रोजेक्ट को Node require स्टेटमेंट का इस्तेमाल करके, Cloud Functions और एडमिन SDK टूल के मॉड्यूल इंपोर्ट करने होंगे. अपनी index.js फ़ाइल में, यहां दी गई जैसी लाइनें जोड़ें:

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

ये लाइनें firebase-functions और firebase-admin मॉड्यूल लोड करती हैं. साथ ही, admin ऐप्लिकेशन इंस्टेंस को शुरू करती हैं, जिससे Cloud Firestore में बदलाव किए जा सकते हैं. FCM, Authentication, और Firebase Realtime Database के लिए Admin SDK की सहायता उपलब्ध है. इससे, Cloud Functions का इस्तेमाल करके Firebase को इंटिग्रेट करने का बेहतर तरीका मिलता है.

प्रोजेक्ट शुरू करने पर, Firebase CLI, Cloud Functions नोड मॉड्यूल के लिए Firebase और Firebase SDK टूल को अपने-आप इंस्टॉल कर देता है. अपने प्रोजेक्ट में तीसरे पक्ष की लाइब्रेरी जोड़ने के लिए, package.json में बदलाव करें और npm install चलाएं. ज़्यादा जानकारी के लिए, डिपेंडेंसी मैनेज करना देखें.

addMessage() फ़ंक्शन जोड़ना

addMessage() फ़ंक्शन के लिए, index.js में ये लाइनें जोड़ें:

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

addMessage() फ़ंक्शन एक एचटीटीपी एंडपॉइंट है. एंडपॉइंट पर किए गए किसी भी अनुरोध के नतीजे में, ExpressJS स्टाइल के Request और Response ऑब्जेक्ट मिलते हैं. इन्हें onRequest() कॉलबैक में पास किया जाता है.

एचटीटीपी फ़ंक्शन सिंक्रोनस होते हैं (कॉल किए जा सकने वाले फ़ंक्शन की तरह), इसलिए आपको जितनी जल्दी हो सके उतनी जल्दी जवाब भेजना चाहिए और Cloud Firestore का इस्तेमाल करके काम को बाद के लिए छोड़ना चाहिए. addMessage() एचटीटीपी फ़ंक्शन, एचटीटीपी एंडपॉइंट को टेक्स्ट वैल्यू पास करता है और उसे पाथ /messages/:documentId/original के तहत डेटाबेस में डालता है.

makeUppercase() फ़ंक्शन जोड़ना

makeUppercase() फ़ंक्शन के लिए, index.js में ये लाइनें जोड़ें:

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

makeUppercase() फ़ंक्शन तब लागू होता है, जब Cloud Firestore में लिखा जाता है. ref.set फ़ंक्शन से, सुनने के लिए दस्तावेज़ तय किया जाता है. परफ़ॉर्मेंस की वजहों से, आपको ज़्यादा से ज़्यादा सटीक जानकारी देनी चाहिए.

ब्रेसेस—उदाहरण के लिए, {documentId}—"पैरामीटर" वाइल्डकार्ड, जो कॉलबैक में अपना मिलता-जुलता डेटा दिखाता है.

Cloud Firestore, नए मैसेज जोड़े जाने पर onCreate() कॉलबैक को ट्रिगर करता है.

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

अपने फ़ंक्शन के लागू होने की प्रक्रिया को एमुलेट करना

Firebase Local Emulator Suite की मदद से, Firebase प्रोजेक्ट में डिप्लॉय करने के बजाय, लोकल मशीन पर ऐप्लिकेशन बनाए जा सकते हैं और उनकी जांच की जा सकती है. डेवलपमेंट के दौरान लोकल टेस्टिंग का सुझाव दिया जाता है. ऐसा इसलिए, क्योंकि इससे कोडिंग से जुड़ी गड़बड़ियों का जोखिम कम हो जाता है. इन गड़बड़ियों की वजह से, प्रोडक्शन एनवायरमेंट में लागत बढ़ सकती है. उदाहरण के लिए, अनलिमिटेड लूप.

अपने फ़ंक्शन को एमुलेट करने के लिए:

  1. firebase emulators:start चलाएं और Emulator Suite UI के यूआरएल के लिए आउटपुट देखें. यह डिफ़ॉल्ट रूप से localhost:4000 पर सेट होता है. हालांकि, इसे आपके कंप्यूटर पर किसी दूसरे पोर्ट पर होस्ट किया जा सकता है. Emulator Suite UI खोलने के लिए, उस यूआरएल को अपने ब्राउज़र में डालें.

  2. एचटीटीपी फ़ंक्शन addMessage() के यूआरएल के लिए, firebase emulators:start कमांड का आउटपुट देखें. यह http://localhost:5001/MY_PROJECT/us-central1/addMessage जैसा ही दिखेगा. हालांकि, इसमें ये अंतर होंगे:

    1. MY_PROJECT की जगह आपका प्रोजेक्ट आईडी डाला जाएगा.
    2. आपकी लोकल मशीन पर पोर्ट अलग हो सकता है.
  3. फ़ंक्शन के यूआरएल के आखिर में ?text=uppercaseme क्वेरी स्ट्रिंग जोड़ें. यह कुछ ऐसा दिखेगा: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme. इसके अलावा, "uppercaseme" मैसेज को अपनी पसंद के मुताबिक मैसेज में बदला जा सकता है.

  4. अपने ब्राउज़र में यूआरएल को नए टैब में खोलकर, नया मैसेज बनाएं.

  5. Emulator Suite UI में फ़ंक्शन के असर देखें:

    1. लॉग टैब में, आपको नए लॉग दिखेंगे. इससे पता चलेगा कि addMessage() और makeUppercase() फ़ंक्शन चल चुके हैं:

      i functions: Beginning execution of "addMessage"

      i functions: Beginning execution of "makeUppercase"

    2. Firestore टैब में, आपको एक दस्तावेज़ दिखेगा. इसमें आपका मूल मैसेज और बड़े अक्षरों में लिखा गया मैसेज दिखेगा. अगर मूल मैसेज "uppercaseme" था, तो आपको "UPPERCASEME" दिखेगा.

प्रोडक्शन एनवायरमेंट में फ़ंक्शन डिप्लॉय करना

जब आपके फ़ंक्शन एम्युलेटर में ज़रूरत के मुताबिक काम करने लगें, तो उन्हें प्रोडक्शन एनवायरमेंट में डिप्लॉय किया जा सकता है, टेस्ट किया जा सकता है, और चलाया जा सकता है. ध्यान रखें कि सुझाए गए Node.js 14 रनटाइम एनवायरमेंट में डिप्लॉय करने के लिए, आपका प्रोजेक्ट Blaze के प्राइसिंग प्लान पर होना चाहिए. Cloud Functions कीमत देखें.

ट्यूटोरियल पूरा करने के लिए, अपने फ़ंक्शन डिप्लॉय करें. इसके बाद, makeUppercase() को ट्रिगर करने के लिए addMessage() को लागू करें.

  1. अपने फ़ंक्शन को डिप्लॉय करने के लिए, इस कमांड को चलाएं:

     firebase deploy --only functions
     

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

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

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

    अगर आपको ऐक्सेस से जुड़ी गड़बड़ियां मिलती हैं, जैसे कि "प्रोजेक्ट का ऐक्सेस देने की अनुमति नहीं दी जा सकी", तो अपने प्रोजेक्ट के लिए कोई दूसरा नाम डालकर देखें.

  2. सीएलआई से मिले addMessage() यूआरएल आउटपुट का इस्तेमाल करके, टेक्स्ट क्वेरी पैरामीटर जोड़ें और उसे ब्राउज़र में खोलें:

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

    यह फ़ंक्शन, ब्राउज़र को डेटाबेस की उस जगह पर मौजूद Firebase कंसोल पर रीडायरेक्ट करता है जहां टेक्स्ट स्ट्रिंग सेव की गई है. यह राइट इवेंट, makeUppercase() को ट्रिगर करता है, जो स्ट्रिंग के अपरकेस वाले वर्शन को लिखता है.

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

प्रोडक्शन में, चलाए जाने वाले इंस्टेंस की कम से कम और ज़्यादा से ज़्यादा संख्या सेट करके, फ़ंक्शन की परफ़ॉर्मेंस को ऑप्टिमाइज़ किया जा सकता है और लागत कंट्रोल की जा सकती है. रनटाइम के इन विकल्पों के बारे में ज़्यादा जानने के लिए, स्केलिंग के व्यवहार को कंट्रोल करना देखें.

पूरे सैंपल कोड की समीक्षा करें

यहां functions/index.js फ़ंक्शन के साथ पूरा addMessage() और makeUppercase() फ़ंक्शन दिया गया है. इन फ़ंक्शन की मदद से, एचटीटीपी एंडपॉइंट को एक पैरामीटर पास किया जा सकता है, जो Cloud Firestore में वैल्यू लिखता है. इसके बाद, स्ट्रिंग के सभी वर्णों को अपरकेस करके उसे बदल देता है.

// The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
const functions = require('firebase-functions/v1');

// The Firebase Admin SDK to access Firestore.
const admin = require("firebase-admin");
admin.initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addMessage = functions.https.onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await admin
    .firestore()
    .collection("messages")
    .add({ original: original });
  // Send back a message that we've successfully written the message
  res.json({ result: `Message with ID: ${writeResult.id} added.` });
});

// Listens for new messages added to /messages/:documentId/original and creates an
// uppercase version of the message to /messages/:documentId/uppercase
exports.makeUppercase = functions.firestore
  .document("/messages/{documentId}")
  .onCreate((snap, context) => {
    // Grab the current value of what was written to Firestore.
    const original = snap.data().original;

    // Access the parameter `{documentId}` with `context.params`
    functions.logger.log("Uppercasing", context.params.documentId, original);

    const uppercase = original.toUpperCase();

    // You must return a Promise when performing asynchronous tasks inside a Functions such as
    // writing to Firestore.
    // Setting an 'uppercase' field in Firestore document returns a Promise.
    return snap.ref.set({ uppercase }, { merge: true });
  });

अगले चरण

इस दस्तावेज़ में, Cloud Functions के लिए फ़ंक्शन मैनेज करने के तरीके के बारे में ज़्यादा जानें. साथ ही, Cloud Functions के साथ काम करने वाले सभी इवेंट टाइप को मैनेज करने का तरीका भी जानें.

Cloud Functions के बारे में ज़्यादा जानने के लिए, ये काम भी किए जा सकते हैं: