Catch up on highlights from Firebase at Google I/O 2023. Learn more

क्लाउड फायरस्टोर ट्रिगर


क्लाउड फ़ंक्शंस के साथ, आप क्लाइंट कोड को अपडेट करने की आवश्यकता के बिना क्लाउड फायरस्टोर में ईवेंट को संभाल सकते हैं। आप दस्तावेज़ स्नैपशॉट इंटरफ़ेस या व्यवस्थापक SDK के माध्यम से Cloud Firestore परिवर्तन कर सकते हैं।

एक सामान्य जीवनचक्र में, Cloud Firestore फ़ंक्शन निम्न कार्य करता है:

  1. किसी विशेष दस्तावेज़ में परिवर्तन की प्रतीक्षा करता है।
  2. जब कोई घटना घटित होती है तो ट्रिगर होता है और अपना कार्य करता है।
  3. एक डेटा ऑब्जेक्ट प्राप्त करता है जिसमें निर्दिष्ट दस्तावेज़ में संग्रहीत डेटा का एक स्नैपशॉट होता है। घटनाओं को लिखने या अद्यतन करने के लिए, डेटा ऑब्जेक्ट में दो स्नैपशॉट होते हैं जो ट्रिगरिंग ईवेंट से पहले और बाद में डेटा स्थिति का प्रतिनिधित्व करते हैं।

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

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

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

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

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

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

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

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

नोड.जेएस

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 ...
    });

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

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

घटना डेटा

डेटा पढ़ना

जब कोई फ़ंक्शन ट्रिगर होता है, तो हो सकता है कि आप अपडेट किए गए दस्तावेज़ से डेटा प्राप्त करना चाहें, या अपडेट से पहले डेटा प्राप्त करना चाहें। आप 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');

लेखन डेटा

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

यह DocumentReference Cloud Firestore Node.js SDK से आता है और इसमें 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});
    });

ट्रिगर घटना के बाहर डेटा

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

नोड.जेएस

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({ ... });
  });

सीमाएँ

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

  • आदेश देने की गारंटी नहीं है। तीव्र परिवर्तन एक अप्रत्याशित क्रम में फ़ंक्शन इनवोकेशन को ट्रिगर कर सकते हैं।
  • ईवेंट कम से कम एक बार डिलीवर किए जाते हैं, लेकिन एक ईवेंट के परिणामस्वरूप कई फ़ंक्शन इनवोकेशन हो सकते हैं। ठीक-ठीक यांत्रिकी पर निर्भर रहने से बचें, और उदासीन कार्यों को लिखें।
  • Cloud Functions के लिए Cloud Firestore ट्रिगर केवल नेटिव मोड में Cloud Firestore के लिए उपलब्ध है। यह डाटास्टोर मोड में क्लाउड फायरस्टोर के लिए उपलब्ध नहीं है।