रीयलटाइम डेटाबेस ट्रिगर

एक सामान्य जीवनचक्र में, एक Firebase रीयलटाइम डेटाबेस फ़ंक्शन निम्न कार्य करता है:

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

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

Firebase रीयलटाइम डेटाबेस परिवर्तन पर एक फ़ंक्शन ट्रिगर करें

फ़ायरबेस रीयलटाइम डेटाबेस ईवेंट को संभालने वाला फ़ंक्शन बनाने के लिए firebase-functions/v2/database सबपैकेज का उपयोग करें। फ़ंक्शन ट्रिगर होने पर नियंत्रित करने के लिए, ईवेंट हैंडलर में से एक निर्दिष्ट करें, और रीयलटाइम डेटाबेस पथ निर्दिष्ट करें जहां यह ईवेंट सुनेगा।

फंक्शन लोकेशन सेट करना

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

रीयलटाइम डेटाबेस ईवेंट को संभालना

फ़ंक्शंस आपको विशिष्टता के दो स्तरों पर रीयलटाइम डेटाबेस ईवेंट को संभालने देता है; आप विशेष रूप से केवल लिखने, बनाने, अद्यतन करने या हटाने की घटनाओं के लिए सुन सकते हैं, या आप संदर्भ में किसी भी प्रकार के किसी भी परिवर्तन को सुन सकते हैं।

रीयलटाइम डेटाबेस इवेंट का जवाब देने के लिए ये हैंडलर उपलब्ध हैं:

  • onValueWritten() केवल तभी ट्रिगर होता है जब डेटा रीयलटाइम डेटाबेस में लिखा जाता है।
  • onValueCreated() केवल तभी ट्रिगर होता है जब डेटा रीयलटाइम डेटाबेस में बनाया जाता है।
  • onValueUpdated() केवल तभी ट्रिगर होता है जब डेटा रीयलटाइम डेटाबेस में अपडेट किया जाता है।
  • onValueDeleted() केवल तभी ट्रिगर होता है जब रीयलटाइम डेटाबेस में डेटा हटा दिया जाता है।

उदाहरण और पथ निर्दिष्ट करें

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

उदाहरण के लिए, उदाहरण के लिए onValueWritten() का उपयोग करना:

# All Realtime Database instances in default function region us-central1 at path "/user/{uid}"
# There must be at least one Realtime Database present in us-central1.
const onwrittenfunctiondefault = onValueWritten("/user/{uid}", (event) => {
  // …
});

# Instance named "my-app-db-2", at path "/user/{uid}".
# The "my-app-db-2" instance must exist in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid}",
    instance: "my-app-db-2"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

# Instance with "my-app-db-" prefix, at path "/user/{uid}", where uid ends with @gmail.com.
# There must be at least one Realtime Database with "my-app-db-*" prefix in this region.
const onwrittenfunctioninstance = onValueWritten(
  {
    ref: "/user/{uid=*@gmail.com}",
    instance: "my-app-db-*"
    // This example assumes us-central1, but to set location:
    // region: "europe-west1"
  },
  (event) => {
    // …
  }
);

ये पैरामीटर रीयलटाइम डेटाबेस इंस्टेंस के भीतर एक निश्चित पथ पर लिखने को संभालने के लिए आपके फ़ंक्शन को निर्देशित करते हैं।

पथ विनिर्देश उन सभी लेखन से मेल खाते हैं जो किसी पथ को स्पर्श करते हैं, जिसमें उसके नीचे कहीं भी होने वाले लेखन शामिल हैं। यदि आप अपने फ़ंक्शन के लिए पथ को /foo/bar के रूप में सेट करते हैं, तो यह इन दोनों स्थानों की घटनाओं से मेल खाता है:

 /foo/bar
 /foo/bar/baz/really/deep/path

किसी भी मामले में, फायरबेस व्याख्या करता है कि घटना /foo/bar पर होती है, और घटना डेटा में /foo/bar पर पुराना और नया डेटा शामिल होता है। यदि ईवेंट डेटा बड़ा हो सकता है, तो अपने डेटाबेस के रूट के पास एकल फ़ंक्शन के बजाय गहरे पथ पर एकाधिक फ़ंक्शन का उपयोग करने पर विचार करें। सर्वोत्तम प्रदर्शन के लिए, केवल यथासंभव गहरे स्तर पर डेटा का अनुरोध करें।

वाइल्डकार्डिंग और कैप्चरिंग

कैप्चर करने के लिए आप {key} , {key=*} , {key=prefix*} , {key=*suffix} का उपयोग कर सकते हैं। * , prefix* , *suffix । नोट: ** मल्टी-सेगमेंट वाइल्डकार्डिंग का प्रतिनिधित्व करता है, जिसका आरटीडीबी समर्थन नहीं करता है। पथ पैटर्न को समझें देखें।

पथ वाइल्डकार्डिंग। आप वाइल्डकार्ड के रूप में पथ घटक निर्दिष्ट कर सकते हैं:

  • तारांकन चिह्न का उपयोग करना, * . उदाहरण के लिए, foo/* किसी भी बच्चे से foo/ नीचे नोड पदानुक्रम के एक स्तर से मेल खाता है।
  • सटीक तारांकन वाले खंड का उपयोग करना, * . उदाहरण के लिए, foo/app*-us foo/ के नीचे किसी भी चाइल्ड सेगमेंट से app प्रीफ़िक्स और -us प्रत्यय के साथ मेल खाता है।

वाइल्डकार्ड वाले पथ कई घटनाओं से मेल खा सकते हैं, उदाहरण के लिए, एक एकल लेखन। का एक सम्मिलित करें

{
  "foo": {
    "hello": "world",
    "firebase": "functions"
  }
}

पथ "/foo/*" से दो बार मेल खाता है: एक बार "hello": "world" के साथ और फिर "firebase": "functions" के साथ।

पथ कैप्चरिंग। आप अपने फ़ंक्शन कोड (जैसे /user/{uid} , /user/{uid=*-us} ) में उपयोग किए जाने वाले नामित चरों में पथ मिलान कैप्चर कर सकते हैं।

कैप्चर चर के मान आपके फ़ंक्शन के डेटाबेस .DatabaseEvent.params ऑब्जेक्ट के भीतर उपलब्ध हैं।

उदाहरण वाइल्डकार्डिंग। आप वाइल्डकार्डिंग का उपयोग करके एक इंस्टेंस घटक भी निर्दिष्ट कर सकते हैं। एक उदाहरण वाइल्डकार्ड में उपसर्ग, प्रत्यय या दोनों हो सकते हैं (जैसे my-app-*-prod )।

वाइल्डकार्ड और कैप्चर संदर्भ

क्लाउड फ़ंक्शंस v2 और रीयलटाइम डेटाबेस के साथ, ref और instance निर्दिष्ट करते समय एक पैटर्न का उपयोग किया जा सकता है। प्रत्येक ट्रिगर इंटरफ़ेस में फ़ंक्शन को स्कोप करने के लिए निम्नलिखित विकल्प होंगे:

निर्दिष्ट ref instance निर्दिष्ट करना व्‍यवहार
सिंगल ( /foo/bar ) निर्दिष्ट नहीं फ़ंक्शन क्षेत्र में सभी उदाहरणों के लिए स्कोप हैंडलर।
सिंगल ( /foo/bar ) सिंगल ( 'my-new-db' ) फ़ंक्शन क्षेत्र में विशिष्ट उदाहरण के लिए स्कोप हैंडलर।
सिंगल ( /foo/bar ) पैटर्न ( 'inst-prefix*' ) फ़ंक्शन क्षेत्र में पैटर्न से मेल खाने वाले सभी उदाहरणों के लिए स्कोप हैंडलर।
पैटर्न ( /foo/{bar} ) निर्दिष्ट नहीं फ़ंक्शन क्षेत्र में सभी उदाहरणों के लिए स्कोप हैंडलर।
पैटर्न ( /foo/{bar} ) सिंगल ( 'my-new-db' ) फ़ंक्शन क्षेत्र में विशिष्ट उदाहरण के लिए स्कोप हैंडलर।
पैटर्न ( /foo/{bar} ) पैटर्न ( 'inst-prefix*' ) फ़ंक्शन क्षेत्र में पैटर्न से मेल खाने वाले सभी उदाहरणों के लिए स्कोप हैंडलर।

ईवेंट डेटा संभालें

रीयलटाइम डेटाबेस इवेंट को हैंडल करते समय, लौटाया गया डेटा ऑब्जेक्ट DataSnapshot है।

onValueWritten या onValueUpdated ईवेंट के लिए, पहला पैरामीटर एक Change ऑब्जेक्ट है जिसमें दो स्नैपशॉट होते हैं जो ट्रिगरिंग ईवेंट से पहले और बाद में डेटा स्थिति का प्रतिनिधित्व करते हैं।

onValueCreated और onValueDeleted ईवेंट के लिए, लौटाया गया डेटा ऑब्जेक्ट बनाए या हटाए गए डेटा का एक स्नैपशॉट होता है।

इस उदाहरण में, फ़ंक्शन snap के रूप में निर्दिष्ट पथ foo/bar के लिए स्नैपशॉट पुनर्प्राप्त करता है, उस स्थान पर स्ट्रिंग को अपरकेस में परिवर्तित करता है, और उस संशोधित स्ट्रिंग को डेटाबेस में लिखता है:

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
export makeuppercase = onValueCreated("foo/bar", (event) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      functions.logger.log('Uppercasing', event.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return event.data.ref.parent.child('uppercase').set(uppercase);
    });

पिछला मान पढ़ना

Change ऑब्जेक्ट में before की संपत्ति है जो आपको घटना से पहले रीयलटाइम डेटाबेस में सहेजी गई चीज़ों का निरीक्षण करने देती है। before की संपत्ति एक DataSnapshot है जहां सभी विधियां (उदाहरण के लिए, val() और exists() ) पिछले मान को संदर्भित करती हैं। आप मूल DataSnapshot का उपयोग करके या after की संपत्ति को पढ़कर फिर से नया मान पढ़ सकते हैं। किसी भी Change पर यह गुण एक अन्य डेटा DataSnapshot है जो घटना होने के बाद डेटा की स्थिति का प्रतिनिधित्व करता है।

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

    exports makeuppercase = onValueWritten("/messages/{pushId}/original", (event) => {
          // Only edit data when it is first created.
          if (event.data.before.exists()) {
            return null;
          }
          // Exit when the data is deleted.
          if (!event.data.after.exists()) {
            return null;
          }
          // Grab the current value of what was written to the Realtime Database.
          const original = event.data.after.val();
          console.log('Uppercasing', event.params.pushId, original);
          const uppercase = original.toUpperCase();
          // You must return a Promise when performing asynchronous tasks inside a Functions such as
          // writing to the Firebase Realtime Database.
          // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
          return event.data.after.ref.parent.child('uppercase').set(uppercase);
        });