Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

डेटाबेस ट्रिगर

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

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

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

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

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

ईवेंट हैंडलर सेट करें

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

  • onWrite() , जो रीयलटाइम डेटाबेस में डेटा बनाए जाने, अपडेट करने या हटाए जाने पर ट्रिगर होता है।
  • onCreate() , जो रीयलटाइम डेटाबेस में नया डेटा बनाए जाने पर ट्रिगर होता है।
  • onUpdate() , जो रीयलटाइम डेटाबेस में डेटा अपडेट होने पर ट्रिगर होता है।
  • onDelete() , जो रीयलटाइम डेटाबेस से डेटा हटाए जाने पर ट्रिगर होता है।

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

यह नियंत्रित करने के लिए कि आपका फ़ंक्शन कब और कहां ट्रिगर होना चाहिए, ref(path) निर्दिष्ट करने के लिए ref(path) पर कॉल करें, और वैकल्पिक रूप से एक रीयलटाइम डेटाबेस उदाहरण निर्दिष्ट करें instance('INSTANCE_NAME') । यदि आप कोई इंस्टेंस निर्दिष्ट नहीं करते हैं, तो फ़ंक्शन फ़ायरबेस प्रोजेक्ट के लिए डिफ़ॉल्ट रीयलटाइम डेटाबेस इंस्टेंस पर लागू होता है उदाहरण के लिए:

  • डिफ़ॉल्ट रीयलटाइम डेटाबेस उदाहरण: functions.database.ref('/foo/bar')
  • "my-app-db-2" नाम का उदाहरण: functions.database.instance('my-app-db-2').ref('/foo/bar')

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

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

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

आप एक पथ घटक को वाइल्डकार्ड के रूप में निर्दिष्ट कर सकते हैं, इसके आस-पास घुंघराले कोष्ठक; ref('foo/{bar}') /foo किसी भी बच्चे से मेल खाता है। इन वाइल्डकार्ड पथ घटकों के मान आपके फ़ंक्शन के EventContext.params ऑब्जेक्ट में उपलब्ध हैं। इस उदाहरण में, मान context.params.bar रूप में उपलब्ध है।

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

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

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

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

रीयलटाइम डेटाबेस इवेंट को हैंडल करते समय, लौटाया गया डेटा ऑब्जेक्टDataSnapshotonWrite या onUpdate इवेंट के लिए, पहला पैरामीटर एक Change ऑब्जेक्ट है जिसमें दो स्नैपशॉट होते हैं जो ट्रिगरिंग इवेंट से पहले और बाद में डेटा स्थिति का प्रतिनिधित्व करते हैं। के लिए onCreate और onDelete घटनाओं, दिए गए डेटा वस्तु बनाया या नष्ट कर दिया डेटा का एक स्नैपशॉट है।

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

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = snapshot.val();
      functions.logger.log('Uppercasing', context.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 snapshot.ref.parent.child('uppercase').set(uppercase);
    });

उपयोगकर्ता प्रमाणीकरण जानकारी तक पहुंचना

EventContext.auth और EventContext.authType , आप किसी फ़ंक्शन को ट्रिगर करने वाले उपयोगकर्ता के लिए अनुमतियों सहित उपयोगकर्ता जानकारी तक पहुंच सकते हैं। यह सुरक्षा नियमों को लागू करने के लिए उपयोगी हो सकता है, जिससे आपके फ़ंक्शन को उपयोगकर्ता की अनुमतियों के स्तर के आधार पर विभिन्न कार्यों को पूरा करने की अनुमति मिलती है:

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

exports.simpleDbFunction = functions.database.ref('/path')
    .onCreate((snap, context) => {
      if (context.authType === 'ADMIN') {
        // do something
      } else if (context.authType === 'USER') {
        console.log(snap.val(), 'written by', context.auth.uid);
      }
    });

साथ ही, आप उपयोगकर्ता प्रमाणीकरण जानकारी का लाभ किसी उपयोगकर्ता को "प्रतिरूपण" करने और उपयोगकर्ता की ओर से लेखन कार्य करने के लिए कर सकते हैं। समवर्ती मुद्दों को रोकने के लिए नीचे दिखाए गए अनुसार ऐप इंस्टेंस को हटाना सुनिश्चित करें:

exports.impersonateMakeUpperCase = functions.database.ref('/messages/{pushId}/original')
    .onCreate((snap, context) => {
      const appOptions = JSON.parse(process.env.FIREBASE_CONFIG);
      appOptions.databaseAuthVariableOverride = context.auth;
      const app = admin.initializeApp(appOptions, 'app');
      const uppercase = snap.val().toUpperCase();
      const ref = snap.ref.parent.child('uppercase');

      const deleteApp = () => app.delete().catch(() => null);

      return app.database().ref(ref).set(uppercase).then(res => {
        // Deleting the app is necessary for preventing concurrency leaks
        return deleteApp().then(() => res);
      }).catch(err => {
        return deleteApp().then(() => Promise.reject(err));
      });
    });

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

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

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

exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onWrite((change, context) => {
      // Only edit data when it is first created.
      if (change.before.exists()) {
        return null;
      }
      // Exit when the data is deleted.
      if (!change.after.exists()) {
        return null;
      }
      // Grab the current value of what was written to the Realtime Database.
      const original = change.after.val();
      console.log('Uppercasing', context.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 change.after.ref.parent.child('uppercase').set(uppercase);
    });