ক্লাউড ফাংশন সহ ক্লাউড ফায়ারস্টোর প্রসারিত করুন

Cloud Functions সাথে, আপনি আপনার Cloud Firestore ডাটাবেসের পরিবর্তনের কারণে ট্রিগার হওয়া ইভেন্টগুলি পরিচালনা করতে Node.js কোড স্থাপন করতে পারেন৷ এটি আপনাকে আপনার নিজের সার্ভারগুলি না চালিয়ে সহজেই আপনার অ্যাপে সার্ভার-সাইড কার্যকারিতা যোগ করতে দেয়৷

ব্যবহারের ক্ষেত্রে উদাহরণের জন্য, Cloud Functions সাথে আমি কী করতে পারি? অথবা ফাংশন নমুনা GitHub সংগ্রহস্থল.

Cloud Firestore ফাংশন ট্রিগার করে

Cloud Functions for Firebase একটি 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 (1ম প্রজন্ম) Firestore নেটিভ মোডে একটি বিদ্যমান "(ডিফল্ট)" ডাটাবেসের পূর্বশর্ত। এটি Cloud Firestore নামের ডেটাবেস বা ডেটাস্টোর মোড সমর্থন করে না। অনুগ্রহ করে এই ধরনের ক্ষেত্রে ইভেন্ট কনফিগার করতে Cloud Functions (2nd gen) ব্যবহার করুন।
  • অর্ডার নিশ্চিত করা হয় না. দ্রুত পরিবর্তনগুলি একটি অপ্রত্যাশিত ক্রমে ফাংশন আহ্বানকে ট্রিগার করতে পারে।
  • ইভেন্টগুলি অন্তত একবার বিতরণ করা হয়, কিন্তু একটি একক ইভেন্ট একাধিক ফাংশন আহ্বানের ফলে হতে পারে। ঠিক-একবার মেকানিক্সের উপর নির্ভর করে এড়িয়ে চলুন এবং অদম্য ফাংশন লিখুন।
  • ডেটাস্টোর মোডে Cloud Firestore Cloud Functions (২য় প্রজন্ম) প্রয়োজন। Cloud Functions (1ম প্রজন্ম) ডেটাস্টোর মোড সমর্থন করে না।
  • একটি ট্রিগার একটি একক ডাটাবেসের সাথে যুক্ত। আপনি একাধিক ডাটাবেসের সাথে মেলে এমন একটি ট্রিগার তৈরি করতে পারবেন না।
  • একটি ডাটাবেস মুছে দিলে সেই ডাটাবেসের জন্য কোনো ট্রিগার স্বয়ংক্রিয়ভাবে মুছে যায় না। ট্রিগারটি ইভেন্টগুলি সরবরাহ করা বন্ধ করে তবে আপনি ট্রিগারটি মুছে না দেওয়া পর্যন্ত বিদ্যমান থাকবে৷
  • যদি একটি মিলে যাওয়া ইভেন্ট সর্বোচ্চ অনুরোধের আকারকে অতিক্রম করে, তাহলে ইভেন্টটি Cloud Functions (প্রথম প্রজন্ম) বিতরণ করা যাবে না।
    • অনুরোধের আকারের কারণে ইভেন্টগুলি বিতরণ করা হয়নি প্ল্যাটফর্ম লগগুলিতে লগ ইন করা হয় এবং প্রকল্পের জন্য লগ ব্যবহারের জন্য গণনা করা হয়৷
    • আপনি লগ এক্সপ্লোরার-এ এই লগগুলি খুঁজে পেতে পারেন error তীব্রতার "প্রথম প্রজন্মের সীমা অতিক্রম করার কারণে ইভেন্টটি ক্লাউড ফাংশনে বিতরণ করতে পারে না..."। আপনি functionName ক্ষেত্রের অধীনে ফাংশনের নাম খুঁজে পেতে পারেন। receiveTimestamp ক্ষেত্রটি এখন থেকে এক ঘন্টার মধ্যে থাকলে, আপনি টাইমস্ট্যাম্পের আগে এবং পরে একটি স্ন্যাপশট সহ প্রশ্নে থাকা নথিটি পড়ে প্রকৃত ইভেন্ট বিষয়বস্তু অনুমান করতে পারেন।
    • এই ধরনের ক্যাডেন্স এড়াতে, আপনি করতে পারেন:
      • মাইগ্রেট করুন এবং Cloud Functions আপগ্রেড করুন (২য় প্রজন্ম)
      • ডকুমেন্টটি ছোট করুন
      • প্রশ্নে থাকা Cloud Functions মুছুন
    • আপনি বর্জন ব্যবহার করে নিজেই লগিং বন্ধ করতে পারেন তবে মনে রাখবেন যে আপত্তিকর ঘটনাগুলি এখনও বিতরণ করা হবে না৷