क्लाउड फ़ंक्शंस के साथ क्लाउड फायरस्टोर का विस्तार करें

क्लाउड फ़ंक्शंस के साथ, आप अपने क्लाउड फायरस्टोर डेटाबेस में परिवर्तनों से उत्पन्न घटनाओं को संभालने के लिए Node.js कोड को तैनात कर सकते हैं। यह आपको अपना स्वयं का सर्वर चलाए बिना आसानी से अपने ऐप में सर्वर-साइड कार्यक्षमता जोड़ने की अनुमति देता है।

उपयोग के मामलों के उदाहरण के लिए, मैं क्लाउड फ़ंक्शंस के साथ क्या कर सकता हूं? देखें। या फ़ंक्शंस नमूने GitHub रिपॉजिटरी।

क्लाउड फायरस्टोर फ़ंक्शन ट्रिगर

फायरबेस एसडीके के लिए क्लाउड फ़ंक्शंस एक functions.firestore ऑब्जेक्ट निर्यात करता है जो आपको विशिष्ट क्लाउड फायरस्टोर ईवेंट से जुड़े हैंडलर बनाने की अनुमति देता है।

घटना प्रकार चालू कर देना
onCreate जब कोई दस्तावेज़ पहली बार लिखा जाता है तो ट्रिगर हो जाता है।
onUpdate यह तब ट्रिगर होता है जब कोई दस्तावेज़ पहले से मौजूद हो और उसका कोई मान बदल गया हो।
onDelete जब डेटा वाला दस्तावेज़ हटा दिया जाता है तो ट्रिगर हो जाता है।
onWrite onCreate , onUpdate या onDelete ट्रिगर होने पर ट्रिगर होता है।

यदि आपके पास अभी तक फ़ायरबेस के लिए क्लाउड फ़ंक्शंस के लिए कोई प्रोजेक्ट सक्षम नहीं है, तो फ़ायरबेस प्रोजेक्ट के लिए अपने क्लाउड फ़ंक्शंस को कॉन्फ़िगर और सेट करने के लिए प्रारंभ करें: अपना पहला फ़ंक्शंस लिखें और तैनात करें पढ़ें।

क्लाउड फायरस्टोर-ट्रिगर फ़ंक्शन लिखना

फ़ंक्शन ट्रिगर को परिभाषित करें

क्लाउड फायरस्टोर ट्रिगर को परिभाषित करने के लिए, एक दस्तावेज़ पथ और एक ईवेंट प्रकार निर्दिष्ट करें:

नोड.जे.एस

const functions = require('firebase-functions');

exports.myFunction = functions.firestore
  .document('my-collection/{docId}')
  .onWrite((change, context) => { /* ... */ });

दस्तावेज़ पथ किसी विशिष्ट दस्तावेज़ या वाइल्डकार्ड पैटर्न का संदर्भ दे सकते हैं।

एकल दस्तावेज़ निर्दिष्ट करें

यदि आप किसी विशिष्ट दस्तावेज़ में किसी भी बदलाव के लिए किसी ईवेंट को ट्रिगर करना चाहते हैं तो आप निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं।

नोड.जे.एस

// Listen for any change on document `marie` in collection `users`
exports.myFunctionName = functions.firestore
    .document('users/marie').onWrite((change, context) => {
      // ... Your code here
    });

वाइल्डकार्ड का उपयोग करके दस्तावेज़ों का एक समूह निर्दिष्ट करें

यदि आप दस्तावेज़ों के समूह में ट्रिगर संलग्न करना चाहते हैं, जैसे कि किसी निश्चित संग्रह में कोई दस्तावेज़, तो दस्तावेज़ आईडी के स्थान पर {wildcard} उपयोग करें:

नोड.जे.एस

// Listen for changes in all documents in the 'users' collection
exports.useWildcard = functions.firestore
    .document('users/{userId}')
    .onWrite((change, context) => {
      // If we set `/users/marie` to {name: "Marie"} then
      // context.params.userId == "marie"
      // ... and ...
      // change.after.data() == {name: "Marie"}
    });

इस उदाहरण में, जब users में किसी दस्तावेज़ पर कोई फ़ील्ड बदला जाता है, तो यह userId नामक वाइल्डकार्ड से मेल खाता है।

यदि users किसी दस्तावेज़ में उपसंग्रह हैं, और उन उपसंग्रहों के दस्तावेज़ों में से एक फ़ील्ड बदल दिया गया है, तो userId वाइल्डकार्ड ट्रिगर नहीं होता है।

वाइल्डकार्ड मिलान दस्तावेज़ पथ से निकाले जाते हैं और context.params में संग्रहीत किए जाते हैं। आप स्पष्ट संग्रह या दस्तावेज़ आईडी को प्रतिस्थापित करने के लिए जितने चाहें उतने वाइल्डकार्ड परिभाषित कर सकते हैं, उदाहरण के लिए:

नोड.जे.एस

// Listen for changes in all documents in the 'users' collection and all subcollections
exports.useMultipleWildcards = functions.firestore
    .document('users/{userId}/{messageCollectionId}/{messageId}')
    .onWrite((change, context) => {
      // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then
      // context.params.userId == "marie";
      // context.params.messageCollectionId == "incoming_messages";
      // context.params.messageId == "134";
      // ... and ...
      // change.after.data() == {body: "Hello"}
    });

इवेंट ट्रिगर

नया दस्तावेज़ बनाते समय फ़ंक्शन को ट्रिगर करें

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

नोड.जे.एस

exports.createUser = functions.firestore
    .document('users/{userId}')
    .onCreate((snap, context) => {
      // Get an object representing the document
      // e.g. {'name': 'Marie', 'age': 66}
      const newValue = snap.data();

      // access a particular field as you would any JS property
      const name = newValue.name;

      // perform desired operations ...
    });

दस्तावेज़ अद्यतन होने पर फ़ंक्शन ट्रिगर करें

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

नोड.जे.एस

exports.updateUser = functions.firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      // Get an object representing the document
      // e.g. {'name': 'Marie', 'age': 66}
      const newValue = change.after.data();

      // ...or the previous value before this update
      const previousValue = change.before.data();

      // access a particular field as you would any JS property
      const name = newValue.name;

      // perform desired operations ...
    });

किसी दस्तावेज़ को हटाए जाने पर फ़ंक्शन को ट्रिगर करें

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

नोड.जे.एस

exports.deleteUser = functions.firestore
    .document('users/{userID}')
    .onDelete((snap, context) => {
      // Get an object representing the document prior to deletion
      // e.g. {'name': 'Marie', 'age': 66}
      const deletedValue = snap.data();

      // perform desired operations ...
    });

किसी दस्तावेज़ में सभी परिवर्तनों के लिए एक फ़ंक्शन ट्रिगर करें

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

नोड.जे.एस

exports.modifyUser = functions.firestore
    .document('users/{userID}')
    .onWrite((change, context) => {
      // Get an object with the current document value.
      // If the document does not exist, it has been deleted.
      const document = change.after.exists ? change.after.data() : null;

      // Get an object with the previous document value (for update or delete)
      const oldDocument = change.before.data();

      // perform desired operations ...
    });

डेटा पढ़ना और लिखना

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

घटना डेटा

डेटा पढ़ना

जब कोई फ़ंक्शन ट्रिगर होता है, तो हो सकता है कि आप अपडेट किए गए दस्तावेज़ से डेटा प्राप्त करना चाहें, या अपडेट से पहले डेटा प्राप्त करना चाहें। आप change.before.data() का उपयोग करके पिछला डेटा प्राप्त कर सकते हैं, जिसमें अद्यतन से पहले दस्तावेज़ स्नैपशॉट शामिल है। इसी तरह, change.after.data() अद्यतन के बाद दस्तावेज़ स्नैपशॉट स्थिति शामिल है।

नोड.जे.एस

exports.updateUser2 = functions.firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      // Get an object representing the current document
      const newValue = change.after.data();

      // ...or the previous value before this update
      const previousValue = change.before.data();
    });

आप गुणों तक उसी तरह पहुँच सकते हैं जैसे आप किसी अन्य ऑब्जेक्ट में करते हैं। वैकल्पिक रूप से, आप विशिष्ट फ़ील्ड तक पहुंचने के लिए get फ़ंक्शन का उपयोग कर सकते हैं:

नोड.जे.एस

// Fetch data using standard accessors
const age = snap.data().age;
const name = snap.data()['name'];

// Fetch data using built in accessor
const experience = snap.get('experience');

डेटा लिखना

प्रत्येक फ़ंक्शन आमंत्रण आपके क्लाउड फायरस्टोर डेटाबेस में एक विशिष्ट दस्तावेज़ से जुड़ा हुआ है। आप उस दस्तावेज़ को अपने फ़ंक्शन में लौटाए गए स्नैपशॉट की ref प्रॉपर्टी में DocumentReference के रूप में एक्सेस कर सकते हैं।

यह DocumentReference क्लाउड फायरस्टोर नोड.जेएस एसडीके से आता है और इसमें update() , set() , और remove() जैसी विधियां शामिल हैं ताकि आप फ़ंक्शन को ट्रिगर करने वाले दस्तावेज़ को आसानी से संशोधित कर सकें।

नोड.जे.एस

// Listen for updates to any `user` document.
exports.countNameChanges = functions.firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      // Retrieve the current and previous value
      const data = change.after.data();
      const previousData = change.before.data();

      // We'll only update if the name has changed.
      // This is crucial to prevent infinite loops.
      if (data.name == previousData.name) {
        return null;
      }

      // Retrieve the current count of name changes
      let count = data.name_change_count;
      if (!count) {
        count = 0;
      }

      // Then return a promise of a set operation to update the count
      return change.after.ref.set({
        name_change_count: count + 1
      }, {merge: true});
    });

ट्रिगर इवेंट के बाहर का डेटा

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

नोड.जे.एस

const admin = require('firebase-admin');
admin.initializeApp();

const db = admin.firestore();

exports.writeToFirestore = functions.firestore
  .document('some/doc')
  .onWrite((change, context) => {
    db.doc('some/otherdoc').set({ ... });
  });

सीमाएँ

क्लाउड फ़ंक्शंस के लिए क्लाउड फायरस्टोर ट्रिगर्स के लिए निम्नलिखित सीमाओं पर ध्यान दें:

  • ऑर्डर देने की गारंटी नहीं है. तीव्र परिवर्तन अप्रत्याशित क्रम में फ़ंक्शन इनवोकेशन को ट्रिगर कर सकते हैं।
  • ईवेंट कम से कम एक बार वितरित किए जाते हैं, लेकिन एक ही ईवेंट के परिणामस्वरूप एकाधिक फ़ंक्शन आमंत्रण हो सकते हैं। बिल्कुल-एक बार यांत्रिकी पर निर्भर रहने से बचें, और निष्क्रिय कार्य लिखें।
  • डेटास्टोर मोड में क्लाउड फायरस्टोर को क्लाउड फ़ंक्शंस (दूसरी पीढ़ी) की आवश्यकता होती है। क्लाउड फ़ंक्शंस (पहली पीढ़ी) डेटास्टोर मोड का समर्थन नहीं करता है।
  • क्लाउड फ़ंक्शंस (प्रथम पीढ़ी) केवल "(डिफ़ॉल्ट)" डेटाबेस के साथ काम करता है और क्लाउड फायरस्टोर नामित डेटाबेस का समर्थन नहीं करता है। कृपया नामित डेटाबेस के लिए ईवेंट कॉन्फ़िगर करने के लिए क्लाउड फ़ंक्शंस (दूसरी पीढ़ी) का उपयोग करें।
  • एक ट्रिगर एकल डेटाबेस से जुड़ा होता है। आप ऐसा ट्रिगर नहीं बना सकते जो एकाधिक डेटाबेस से मेल खाता हो।
  • किसी डेटाबेस को हटाने से उस डेटाबेस के लिए कोई भी ट्रिगर स्वचालित रूप से नहीं हटता है। ट्रिगर ईवेंट वितरित करना बंद कर देता है लेकिन तब तक मौजूद रहता है जब तक आप ट्रिगर को हटा नहीं देते
  • यदि कोई मिलान किया गया ईवेंट अधिकतम अनुरोध आकार से अधिक है, तो ईवेंट क्लाउड फ़ंक्शंस (प्रथम पीढ़ी) को वितरित नहीं किया जा सकता है।
    • अनुरोध आकार के कारण वितरित नहीं किए गए इवेंट प्लेटफ़ॉर्म लॉग में लॉग किए जाते हैं और प्रोजेक्ट के लिए लॉग उपयोग में गिने जाते हैं।
    • आप इन लॉग को लॉग एक्सप्लोरर में error गंभीरता के संदेश "पहली पीढ़ी की सीमा से अधिक आकार के कारण इवेंट क्लाउड फ़ंक्शन पर वितरित नहीं किया जा सकता..." के साथ पा सकते हैं। आप फ़ंक्शन का नाम functionName फ़ील्ड के अंतर्गत पा सकते हैं। यदि receiveTimestamp फ़ील्ड अभी भी एक घंटे के भीतर है, तो आप टाइमस्टैंप से पहले और बाद में स्नैपशॉट के साथ प्रश्न में दस्तावेज़ को पढ़कर वास्तविक घटना सामग्री का अनुमान लगा सकते हैं।
    • ऐसी लय से बचने के लिए, आप यह कर सकते हैं:
      • क्लाउड फ़ंक्शंस में माइग्रेट और अपग्रेड करें (दूसरी पीढ़ी)
      • दस्तावेज़ का आकार छोटा करें
      • प्रश्न में क्लाउड फ़ंक्शंस हटाएं
    • आप बहिष्करणों का उपयोग करके लॉगिंग को स्वयं बंद कर सकते हैं लेकिन ध्यान दें कि आपत्तिजनक घटनाएं अभी भी वितरित नहीं की जाएंगी।