अगर आपने Firebase JS SDK टूल या Firebase के अन्य क्लाइंट SDK टूल के साथ काम किया है, तो शायद आपको FirebaseApp इंटरफ़ेस के बारे में पता होगा. साथ ही, यह भी पता होगा कि ऐप्लिकेशन इंस्टेंस को कॉन्फ़िगर करने के लिए इसका इस्तेमाल कैसे किया जाता है. सर्वर साइड पर भी इसी तरह की कार्रवाइयां करने के लिए, Firebase, FirebaseServerApp उपलब्ध कराता है.
FirebaseServerApp , FirebaseApp का एक ऐसा वर्शन है जिसका इस्तेमाल सर्वर-साइड रेंडरिंग (एसएसआर) वाले एनवायरमेंट में किया जा सकता है. इसमें ऐसे टूल शामिल हैं जिनकी मदद से, क्लाइंट-साइड रेंडरिंग (सीएसआर) / सर्वर-साइड रेंडरिंग के बीच के अंतर को खत्म करके, Firebase सेशन जारी रखे जा सकते हैं. इन
टूल और रणनीतियों की मदद से, Firebase की मदद से बनाए गए और
Google के एनवायरमेंट में डिप्लॉय किए गए डाइनैमिक वेब ऐप्लिकेशन को बेहतर बनाया जा सकता है. जैसे,
Firebase App Hosting.
FirebaseServerApp का इस्तेमाल इन कामों के लिए करें:
- उपयोगकर्ता के कॉन्टेक्स्ट में, सर्वर-साइड कोड को एक्ज़ीक्यूट करना. इसके उलट, Firebase Admin SDK टूल के पास पूरे एडमिन के अधिकार होते हैं.
- एसएसआर एनवायरमेंट में, App Check का इस्तेमाल करना.
- क्लाइंट में बनाए गए Firebase Auth सेशन को जारी रखना.
FirebaseServerApp का लाइफ़साइकल
सर्वर-साइड रेंडरिंग (एसएसआर) फ़्रेमवर्क और ब्राउज़र के अलावा अन्य रनटाइम, जैसे कि क्लाउड वर्कर, कई बार एक्ज़ीक्यूट होने पर संसाधनों का फिर से इस्तेमाल करके, शुरू होने में लगने वाले समय को ऑप्टिमाइज़ करते हैं. FirebaseServerApp को रेफ़रंस काउंट मैकेनिज़्म का इस्तेमाल करके, इन एनवायरमेंट के हिसाब से डिज़ाइन किया गया है. अगर कोई ऐप्लिकेशन, initializeServerApp को पिछले initializeServerApp के जैसे ही पैरामीटर के साथ कॉल करता है, तो उसे वही FirebaseServerApp इंस्टेंस मिलता है जिसे पहले ही शुरू किया जा चुका है. इससे, शुरू करने में लगने वाले बेवजह के ओवरहेड और मेमोरी के बंटवारे को कम किया जा सकता है. जब किसी FirebaseServerApp इंस्टेंस पर deleteApp को कॉल किया जाता है, तो रेफ़रंस काउंट कम हो जाता है. साथ ही, रेफ़रंस काउंट शून्य होने के बाद, इंस्टेंस को रिलीज़ कर दिया जाता है.
FirebaseServerApp इंस्टेंस को साफ़ करना
FirebaseServerApp इंस्टेंस पर deleteApp को कब कॉल करना है, यह जानना मुश्किल हो सकता है. खास तौर पर, अगर कई एसिंक्रोनस कार्रवाइयां एक साथ चल रही हों. FirebaseServerAppSettings का releaseOnDeref फ़ील्ड, इसे आसान बनाने में मदद करता है. अगर releaseOnDeref को, अनुरोध के स्कोप के लाइफ़स्पैन वाले किसी ऑब्जेक्ट का रेफ़रंस असाइन किया जाता है (उदाहरण के लिए, एसएसआर अनुरोध का हेडर ऑब्जेक्ट), तो फ़्रेमवर्क के हेडर ऑब्जेक्ट को वापस पाने पर, FirebaseServerApp अपना रेफ़रंस काउंट कम कर देगा. इससे, आपका FirebaseServerApp इंस्टेंस अपने-आप साफ़ हो जाता है.
releaseOnDeref के इस्तेमाल का उदाहरण यहां दिया गया है:
/// Next.js
import { headers } from 'next/headers'
import { FirebaseServerAppSettings, initializeServerApp} from "firebase/app";
export default async function Page() {
const headersObj = await headers();
let appSettings: FirebaseServerAppSettings = {};
appSettings.releaseOnDeref = headersObj;
const serverApp = initializeServerApp(firebaseConfig, appSettings);
...
}
क्लाइंट पर बनाए गए पुष्टि किए गए सेशन फिर से शुरू करना
जब Auth आईडी टोकन के साथ FirebaseServerApp का कोई इंस्टेंस शुरू किया जाता है, तो इससे क्लाइंट-साइड रेंडरिंग (सीएसआर) और सर्वर-साइड रेंडरिंग (एसएसआर) एनवायरमेंट के बीच, पुष्टि किए गए उपयोगकर्ता सेशन को ब्रिज किया जा सकता है. Firebase Auth SDK के वे इंस्टेंस जिन्हें Auth आईडी टोकन वाले FirebaseServerApp ऑब्जेक्ट के साथ शुरू किया गया है, शुरू होने पर उपयोगकर्ता को साइन इन करने की कोशिश करेंगे. इसके लिए, ऐप्लिकेशन को साइन-इन के किसी भी तरीके को कॉल करने की ज़रूरत नहीं होगी.
Auth आईडी टोकन उपलब्ध कराने से, ऐप्लिकेशन क्लाइंट पर Auth के किसी भी साइन-इन तरीके का इस्तेमाल कर सकते हैं. इससे यह पक्का होता है कि सर्वर-साइड पर सेशन जारी रहे. भले ही, उन साइन-इन तरीकों के लिए उपयोगकर्ता के इंटरैक्शन की ज़रूरत हो. इसके अलावा, इससे पुष्टि किए गए Firestore क्वेरी जैसे इंटेंसिव ऑपरेशन को सर्वर पर ऑफ़लोड किया जा सकता है. इससे आपके ऐप्लिकेशन की रेंडरिंग परफ़ॉर्मेंस बेहतर होनी चाहिए.
/// Next.js
import { initializeServerApp } from "firebase/app";
import { getAuth } from "firebase/auth";
// Replace the following with your app's
// Firebase project configuration
const firebaseConfig = {
// ...
};
const firebaseServerAppSettings = {
authIdToken: token // See "Pass client tokens to the server side
// rendering phase" for an example on how transmit
// the token from the client and the server.
}
const serverApp =
initializeServerApp(firebaseConfig,
firebaseServerAppSettings);
const serverAuth = getAuth(serverApp);
// FirebaseServerApp and Auth will now attempt
// to sign in the current user based on provided
// authIdToken.
एसएसआर एनवायरमेंट में, App Check का इस्तेमाल करना
App Check को लागू करने के लिए, App Check SDK टूल के किसी इंस्टेंस की ज़रूरत होती है. Firebase SDK टूल, इंटरनल तौर पर getToken को कॉल करने के लिए इसका इस्तेमाल करते हैं. इसके बाद, जनरेट हुए टोकन को Firebase की सभी सेवाओं के अनुरोधों में शामिल किया जाता है. इससे बैकएंड, ऐप्लिकेशन की पुष्टि कर पाता है.
हालांकि, App Check SDK टूल को ऐप्लिकेशन की पुष्टि के लिए, खास यूरिस्टिक को ऐक्सेस करने के लिए ब्राउज़र की ज़रूरत होती है. इसलिए, इसे सर्वर एनवायरमेंट में शुरू नहीं किया जा सकता.
FirebaseServerApp एक विकल्प उपलब्ध कराता है. अगर FirebaseServerApp को शुरू करते समय, क्लाइंट से जनरेट किया गया App Check टोकन उपलब्ध कराया जाता है, तो Firebase की सेवाओं को कॉल करते समय, Firebase प्रॉडक्ट SDK टूल इसका इस्तेमाल करेंगे. इससे, App Check SDK टूल के किसी इंस्टेंस की ज़रूरत नहीं होगी.
/// Next.js
import { initializeServerApp } from "firebase/app";
// Replace the following with your app's
// Firebase project configuration
const firebaseConfig = {
// ...
};
const firebaseServerAppSettings = {
appCheckToken: token // See "Pass client tokens to the server side
// rendering phase" for an example on how transmit
// the token from the client and the server.
}
const serverApp =
initializeServerApp(firebaseConfig,
firebaseServerAppSettings);
// The App Check token will now be appended to all Firebase service requests.
क्लाइंट टोकन को सर्वर-साइड रेंडरिंग फ़ेज़ में पास करना
पुष्टि किए गए Auth आईडी टोकन (और App Check टोकन) को क्लाइंट से सर्वर-साइड रेंडरिंग (एसएसआर) फ़ेज़ में ट्रांसमिट करने के लिए, सर्विस वर्कर का इस्तेमाल करें. इस तरीके में, फ़ेच के उन अनुरोधों को इंटरसेप्ट करना शामिल है जिनसे एसएसआर ट्रिगर होता है. साथ ही, अनुरोध के हेडर में टोकन जोड़ना शामिल है.
Firebase Auth सर्विस वर्कर के रेफ़रंस के तौर पर लागू करने के लिए, सर्विस वर्कर की मदद से सेशन मैनेज करना
लेख पढ़ें. इसके अलावा, उस कोड के लिए सर्वर साइड
में किए गए बदलाव लेख पढ़ें जिसमें बताया गया है कि
FirebaseServerApp को शुरू करने के लिए, हेडर से इन टोकन को कैसे पार्स किया जाता है.
एसएसआर एनवायरमेंट में, Firestore का इस्तेमाल करना
सर्वर-साइड रेंडरिंग (एसएसआर) की मदद से वेब ऐप्लिकेशन बनाते समय, आपको अक्सर परफ़ॉर्मेंस और उपयोगकर्ता अनुभव को ऑप्टिमाइज़ करने के लिए, सर्वर और क्लाइंट के बीच डेटा शेयर करना पड़ता है. Firestore SDK टूल, सीरियलाइज़ेशन टूल उपलब्ध कराता है. इनकी मदद से, सर्वर पर स्नैपशॉट और खास डेटा टाइप कैप्चर किए जा सकते हैं. साथ ही, इन्हें सीधे अपने क्लाइंट-साइड कॉम्पोनेंट में पास किया जा सकता है. इस प्रोसेस से, बार-बार फ़ेच करने की ज़रूरत नहीं पड़ती. ऐसा इसलिए, क्योंकि क्लाइंट, एसएसआर फ़ेज़ के दौरान पहले से फ़ेच किए गए डेटा का इस्तेमाल करके, स्टेट को हाइड्रेट कर सकता है. इसके अलावा, इन सीरियलाइज़्ड स्टेट से रीयल-टाइम लिसनर पर ट्रांज़िशन किया जा सकता है. इससे यह पक्का होता है कि आपका ऐप्लिकेशन, डेटाबेस के साथ सिंक रहे.
इस सेक्शन में, क्लाइंट-साइड कॉम्पोनेंट में, सर्वर-साइड रेंडरिंग (एसएसआर) फ़ेज़ के दौरान वापस पाए गए डेटा का फिर से इस्तेमाल करने का तरीका बताया गया है.
डेटा टाइप को सीरियलाइज़ करना
Firestore के कुछ डेटा टाइप, अपने डेटा को सीरियलाइज़ किए जा सकने वाले फ़ॉर्मैट में बदलने के लिए, toJSON तरीका उपलब्ध कराते हैं. इनमें Bytes, GeoPoint, Timestamp, और VectorValue जैसे ऑब्जेक्ट के इंस्टेंस शामिल हैं.
JSON फ़ॉर्मैट में डेटा मिलने के बाद, इसे सर्वर से क्लाइंट में, स्टैंडर्ड फ़्रेमवर्क मैकेनिज़्म के ज़रिए या कॉम्पोनेंट के पैरामीटर के तौर पर पास किया जा सकता है. उदाहरण के लिए:
import {
Bytes
} from 'firebase/firestore';
const BYTES_DATA = new Uint8Array([0, 1, 2, 3, 4, 5]);
const bytes = Bytes.fromUint8Array(BYTES_DATA);
const bytesJSON = bytes.toJSON();
डेटा टाइप को डीसीरियलाइज़ करना
Firestore के डेटा टाइप में, सीरियलाइज़ किए गए डेटा को काम करने लायक Firestore डेटा टाइप में बदलने के लिए, स्टैटिक तरीका fromJSON शामिल होता है.
उदाहरण के लिए, यहां Bytes डेटा टाइप को डीसीरियलाइज़ किया गया है:
import {
Bytes
} from 'firebase/firestore';
// Assuming the same `bytesJSON` variable from the previous example.
const deserializedBytes = Bytes.fromJSON(bytesJSON);
Firestore स्नैपशॉट को सीरियलाइज़ और डीसीरियलाइज़ करना
Firestore के डेटा टाइप की तरह, toJSON का इस्तेमाल करके, DocumentSnapshot और QuerySnapshot के इंस्टेंस को सीरियलाइज़ किया जा सकता है. हालांकि, इन्हें डीसीरियलाइज़ करने के लिए, स्टैटिक fromJSON तरीके के बजाय, स्टैंडअलोन फ़ंक्शन documentSnapshotFromJSON और querySnapshotFromJSON का इस्तेमाल करना होगा.
उदाहरण के लिए, querySnapshot कार्रवाई के query नतीजों को
toJSON तरीके का इस्तेमाल करके सीरियलाइज़ किया जा सकता है:
import {
collection,
getDocs,
query,
querySnapshotFromJSON
} from 'firebase/firestore';
// Assuming a configured instance of Firestore in the variable `firestore`.
const queryRef = query(collection(firestore, QUERY_PATH));
const querySnapshot = await getDocs(queryRef);
const querySnapshotJson = querySnapshot.toJSON();
इसके बाद, इस डेटा को डीसीरियलाइज़ किया जा सकता है:
import {
querySnapshotFromJSON
} from 'firebase/firestore';
// deserializedSnapshot is an object of type QuerySnapshot:
const deserializedSnapshot =
querySnapshotFromJSON(firestore, querySnapshotJson);
सीरियलाइज़ किए गए स्नैपशॉट वाले लिसनर
एसएसआर फ़ेज़ के दौरान क्वेरी किया गया डेटा, सीएसआर के शुरुआती रेंडर के लिए काम का होता है. हालांकि, आपको उस जानकारी के रीयल-टाइम अपडेट के लिए, Firestore सेवा की निगरानी करनी पड़ सकती है.
अगर आपके ऐप्लिकेशन को इन रीयल-टाइम अपडेट की ज़रूरत है, तो Firestore SnapshotListener को सीरियलाइज़ किए गए Snapshot
डेटा के साथ शुरू करने के लिए, onSnapshotResume
फ़ंक्शन का इस्तेमाल किया जा सकता है. उदाहरण के लिए:
const observer = {
next: (qs) => {
console.log("onSnapshot invoked: ", qs.data());
},
error: (e) => {
console.log("error callback invoked: ", e.toString());
}
};
const unsubscribe = onSnapshotResume(firestore, querySnapshotJson, observer);