Save the date - Google I/O returns May 18-20. Register to get the most out of the digital experience: Build your schedule, reserve space, participate in Q&As, earn Google Developer profile badges, and more. Register now
This page was translated by the Cloud Translation API.
Switch to English

ডাটাবেস ট্রিগার

ক্লাউড ফাংশন সহ, আপনি ক্লায়েন্ট কোড আপডেট করার প্রয়োজন ছাড়াই ফায়ারবেস রিয়েলটাইম ডেটাবেজে ইভেন্টগুলি পরিচালনা করতে পারেন। ক্লাউড ফাংশন আপনাকে পুরো প্রশাসনিক সুযোগ-সুবিধার সাথে রিয়েলটাইম ডেটাবেস অপারেশন পরিচালনা করতে দেয় এবং তা নিশ্চিত করে যে রিয়েলটাইম ডেটাবেসে প্রতিটি পরিবর্তন পৃথকভাবে প্রক্রিয়াজাত করা হবে। আপনিDataSnapshot মাধ্যমে বা অ্যাডমিন এসডিকে মাধ্যমেDataSnapshot রিয়েলটাইম ডেটাবেস পরিবর্তন করতে পারেন।

একটি সাধারণ লাইফসাইকেলে, ফায়ারবেস রিয়েলটাইম ডেটাবেস ফাংশন নিম্নলিখিতটি করে:

  1. একটি নির্দিষ্ট রিয়েলটাইম ডেটাবেস অবস্থান পরিবর্তন করার জন্য অপেক্ষা করুন।
  2. ট্রিগার যখন কোনও ইভেন্ট ঘটে এবং এর কাজগুলি সম্পাদন করে (দেখুন মেঘ ফাংশনগুলির সাথে আমি কী করতে পারি? ব্যবহারের ক্ষেত্রে উদাহরণগুলির জন্য)।
  3. নির্দিষ্ট নথিতে সঞ্চিত ডেটার স্ন্যাপশট ধারণ করে এমন একটি ডেটা অবজেক্ট গ্রহণ করে।

একটি রিয়েলটাইম ডাটাবেস ফাংশন ট্রিগার

সঙ্গে রিয়েলটাইম ডাটাবেস ইভেন্টের জন্য নতুন ফাংশন তৈরি functions.database । ফাংশনটি ট্রিগার হওয়ার সময় নিয়ন্ত্রণ করতে, ইভেন্ট হ্যান্ডলারগুলির মধ্যে একটি নির্দিষ্ট করুন এবং রিয়েলটাইম ডেটাবেস পাথ নির্দিষ্ট করুন যেখানে এটি ইভেন্টগুলির জন্য শ্রবণ করবে।

ইভেন্ট হ্যান্ডলার সেট করুন

কার্যাদি আপনাকে দুটি নির্দিষ্ট স্তরের রিয়েলটাইম ডেটাবেস ইভেন্টগুলি পরিচালনা করতে দেয়; আপনি কেবলমাত্র সৃষ্টি, আপডেট, বা মুছে ফেলার ইভেন্টগুলির জন্য বিশেষত শুনতে পারেন বা কোনও পথে কোনও প্রকারের পরিবর্তনের জন্য শুনতে পারেন। ক্লাউড ফাংশনগুলি রিয়েলটাইম ডেটাবেসগুলির জন্য এই ইভেন্ট হ্যান্ডলারগুলিকে সমর্থন করে:

  • onWrite() , যা রিয়েলটাইম ডেটাবেসে ডেটা তৈরি, আপডেট, বা মুছে ফেলার সময় ট্রিগার করে।
  • onCreate() , যা রিয়েলটাইম ডেটাবেসে নতুন ডেটা তৈরি হওয়ার সময় ট্রিগার করে।
  • onUpdate() , যা রিয়েলটাইম ডেটাবেসে ডেটা আপডেট হওয়ার সময় ট্রিগার করে।
  • onDelete() , যা রিয়েলটাইম ডেটাবেস থেকে ডেটা মোছার সময় ট্রিগার করে।

উদাহরণ এবং পথ নির্দিষ্ট করুন

আপনার ফাংশনটি কখন এবং কোথায় ট্রিগার করা উচিত তা নিয়ন্ত্রণ করতে কোনও পাথ নির্দিষ্ট করতে ref(path) কল করুন এবং বিকল্প হিসাবে উদাহরণস্বরূপ একটি রিয়েলটাইম ডেটাবেস উল্লেখ করুন instance('INSTANCE_NAME') । যদি আপনি কোনও উদাহরণ নির্দিষ্ট না করেন তবে ফাংশনটি ফায়ারবেস প্রকল্পের জন্য ডিফল্ট রিয়েলটাইম ডেটাবেস উদাহরণটিতে স্থাপন করে উদাহরণস্বরূপ:

  • ডিফল্ট রিয়েলটাইম ডেটাবেস উদাহরণ: ফাংশন.ডাটাবেস.আরএফ functions.database.ref('/foo/bar')
  • দৃষ্টান্তটির নাম "আমার-অ্যাপ-ডিবি -২": functions.database.instance('my-app-db-2').ref('/foo/bar')

এই পদ্ধতিগুলি আপনার ফাংশনকে রিয়েলটাইম ডেটাবেস উদাহরণের মধ্যে নির্দিষ্ট পথে লেখার জন্য পরিচালনা করে direct পাথ স্পেসিফিকেশন সমস্ত লেখার সাথে মেলে যা কোনও পাথ স্পর্শ করে, এর নীচে যে কোনও জায়গায় ঘটে এমন লেখাগুলি সহ। আপনি যদি আপনার ফাংশনটির জন্য /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}" পথটির সাথে দু'বার মিলছে: একবার "hello": "world" এবং আবার "firebase": "functions"

ইভেন্টের ডেটা পরিচালনা করুন

একটি রিয়েলটাইম ডেটাবেস ইভেন্ট পরিচালনা করার সময়,DataSnapshot ডেটা অবজেক্টটি হ'লDataSnapshotonWrite বা onUpdate ইভেন্টগুলির জন্য, প্রথম প্যারামিটারটি এমন একটি Change বস্তু যা দুটি স্ন্যাপশট ধারণ করে যা ট্রিগার ইভেন্টের আগে এবং পরে ডেটার onUpdate উপস্থাপন করে। জন্য 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 থেকে আপনি 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 পরে ডেটার DataSnapshot উপস্থাপন করে এমন আরও একটি 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);
    });