Cloud Functions সাহায্যে, আপনি ক্লাউড ফায়ারস্টোরে ক্লায়েন্ট কোড আপডেট করার প্রয়োজন ছাড়াই ইভেন্টগুলি পরিচালনা করতে পারেন৷ আপনি ডকুমেন্ট স্ন্যাপশট ইন্টারফেসের মাধ্যমে বা অ্যাডমিন SDK-এর মাধ্যমে ক্লাউড ফায়ারস্টোর পরিবর্তন করতে পারেন।
একটি সাধারণ জীবনচক্রে, একটি ক্লাউড ফায়ারস্টোর ফাংশন নিম্নলিখিতগুলি করে:
- একটি নির্দিষ্ট নথিতে পরিবর্তনের জন্য অপেক্ষা করে।
- একটি ঘটনা ঘটলে ট্রিগার করে এবং তার কার্য সম্পাদন করে।
- নির্দিষ্ট নথিতে সংরক্ষিত ডেটার একটি স্ন্যাপশট ধারণ করে এমন একটি ডেটা অবজেক্ট গ্রহণ করে। ইভেন্টগুলি লিখতে বা আপডেট করার জন্য, ডেটা অবজেক্টে দুটি স্ন্যাপশট থাকে যা ট্রিগারিং ইভেন্টের আগে এবং পরে ডেটার অবস্থা উপস্থাপন করে।
ফায়ারস্টোর ইনস্ট্যান্সের অবস্থান এবং ফাংশনের অবস্থানের মধ্যে দূরত্ব উল্লেখযোগ্য নেটওয়ার্ক লেটেন্সি তৈরি করতে পারে। কর্মক্ষমতা অপ্টিমাইজ করতে, যেখানে প্রযোজ্য সেখানে ফাংশন অবস্থান নির্দিষ্ট করার কথা বিবেচনা করুন।
ক্লাউড ফায়ারস্টোর ফাংশন ট্রিগার করে
Cloud Functions for Firebase একটি functions.firestore
অবজেক্ট রপ্তানি করে যা আপনাকে নির্দিষ্ট ক্লাউড ফায়ারস্টোর ইভেন্টের সাথে আবদ্ধ হ্যান্ডলার তৈরি করতে দেয়।
ইভেন্টের ধরন | ট্রিগার |
---|---|
onCreate | যখন একটি নথিতে প্রথমবার লেখা হয় তখন ট্রিগার হয়৷ |
onUpdate | ট্রিগার হয় যখন একটি ডকুমেন্ট আগে থেকেই থাকে এবং কোনো মান পরিবর্তন হয়। |
onDelete | ডেটা সহ একটি নথি মুছে গেলে ট্রিগার হয়৷ |
onWrite | যখন onCreate , onUpdate বা onDelete ট্রিগার হয় তখন ট্রিগার হয়। |
আপনার যদি এখনও Cloud Functions for Firebase জন্য কোনও প্রকল্প সক্রিয় না থাকে, তাহলে পড়ুন শুরু করুন: Cloud Functions for Firebase কনফিগার এবং সেট আপ করতে আপনার প্রথম ফাংশনগুলি লিখুন এবং স্থাপন করুন৷
ক্লাউড ফায়ারস্টোর-ট্রিগার করা ফাংশন লেখা
একটি ফাংশন ট্রিগার সংজ্ঞায়িত করুন
একটি ক্লাউড ফায়ারস্টোর ট্রিগার সংজ্ঞায়িত করতে, একটি নথির পথ এবং একটি ইভেন্টের ধরন নির্দিষ্ট করুন:
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');
ডেটা লেখা
প্রতিটি ফাংশন আহ্বান আপনার ক্লাউড ফায়ারস্টোর ডাটাবেসের একটি নির্দিষ্ট নথির সাথে যুক্ত। আপনি আপনার ফাংশনে ফিরে আসা স্ন্যাপশটের 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 মুছুন
- আপনি বর্জন ব্যবহার করে নিজেই লগিং বন্ধ করতে পারেন তবে মনে রাখবেন যে আপত্তিকর ঘটনাগুলি এখনও বিতরণ করা হবে না৷