Cloud Firestore के ट्रिगर


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

आम तौर पर, Cloud Firestore फ़ंक्शन ये काम करता है:

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

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

Cloud Firestore फ़ंक्शन ट्रिगर

Cloud Functions for Firebase SDK टूल, functions.firestore को एक्सपोर्ट करता है ऑब्जेक्ट देता है, जिसकी मदद से आप खास Cloud Firestore इवेंट से जुड़े हैंडलर बना सकते हैं.

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

अगर आपने अब तक Cloud Functions for Firebase के लिए कोई प्रोजेक्ट चालू नहीं किया है, तो Cloud Functions for Firebase प्रोजेक्ट को कॉन्फ़िगर और सेट अप करने के लिए, शुरू करें: अपने पहले फ़ंक्शन लिखें और उन्हें डिप्लॉय करें लेख पढ़ें.

Cloud Firestore से ट्रिगर होने वाले फ़ंक्शन लिखना

फ़ंक्शन ट्रिगर तय करना

Cloud Firestore ट्रिगर तय करने के लिए, दस्तावेज़ का पाथ और इवेंट का टाइप बताएं:

Node.js

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

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

दस्तावेज़ के पाथ, किसी खास दस्तावेज़ या वाइल्डकार्ड पैटर्न का रेफ़रंस दे सकते हैं.

कोई एक दस्तावेज़ चुनना

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

Node.js

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

वाइल्डकार्ड का इस्तेमाल करके दस्तावेज़ों का एक ग्रुप बनाएं

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

Node.js

// 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 में सेव किया जाता है. साफ़ तौर पर इकट्ठा किए गए कलेक्शन या दस्तावेज़ के आईडी को बदलने के लिए, जितने चाहें उतने वाइल्डकार्ड तय किए जा सकते हैं. उदाहरण के लिए:

Node.js

// 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 को कॉल किया जाता है:

Node.js

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 को कॉल करता है:

Node.js

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 को कॉल करता है:

Node.js

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() फ़ंक्शन का इस्तेमाल करके, Cloud Firestore दस्तावेज़ में बदलाव वाइल्डकार्ड के साथ. इस उदाहरण फ़ंक्शन में modifyUser को कॉल किया गया है अगर कोई उपयोगकर्ता बनाया जाता है, अपडेट किया जाता है या मिटाया जाता है, तो:

Node.js

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 एडमिन SDK का इस्तेमाल किया जा सकता है आपके डेटाबेस का ऐसा होना चाहिए.

इवेंट का डेटा

पढ़ने से जुड़ा डेटा

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

Node.js

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 फ़ंक्शन का इस्तेमाल किया जा सकता है:

Node.js

// 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');

डेटा लिखना

हर फ़ंक्शन का इस्तेमाल, आपके Cloud Firestore डेटाबेस में मौजूद किसी खास दस्तावेज़ से जुड़ा होता है. आपके फ़ंक्शन में दिखाए गए स्नैपशॉट की ref प्रॉपर्टी में, उस दस्तावेज़ को DocumentReference के तौर पर ऐक्सेस किया जा सकता है.

यह DocumentReference, Cloud Firestore Node.js SDK टूल से आता है. इसमें update(), set(), और remove() जैसे तरीके शामिल होते हैं, ताकि आप उस दस्तावेज़ में आसानी से बदलाव कर सकें जिसकी वजह से फ़ंक्शन ट्रिगर हुआ है.

Node.js

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

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

Cloud Functions भरोसेमंद एनवायरमेंट में चलाया जा सकता है. इसका मतलब है कि उन्हें आपके प्रोजेक्ट में सेवा खाते के तौर पर अनुमति मिली है. पढ़ने और लिखने की सुविधा उपलब्ध है Firebase एडमिन SDK का इस्तेमाल करके:

Node.js

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 Functions के लिए Cloud Firestore ट्रिगर की इन सीमाओं का ध्यान रखें:

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