1. शुरू करने से पहले
फायरबेस एक्सटेंशन या तो HTTP अनुरोधों के जवाब में या फायरबेस क्लाउड मैसेजिंग, क्लाउड फायरस्टोर, या पब/सब जैसे अन्य फायरबेस और Google उत्पादों से ट्रिगर होने वाली घटनाओं के जवाब में एक विशिष्ट कार्य या कार्यों का सेट करता है।
आप क्या बनाएंगे
इस कोडलैब में, आप जियोहैशिंग के लिए एक फायरबेस एक्सटेंशन बनाएंगे। एक बार तैनात होने के बाद, आपका एक्सटेंशन फायरस्टोर घटनाओं के जवाब में या कॉल करने योग्य फ़ंक्शन इनवोकेशन के माध्यम से एक्स- और वाई-निर्देशांक को जियोहैश में परिवर्तित करता है। इसका उपयोग डेटा संग्रहीत करने, आपका समय बचाने के लिए आपके सभी लक्षित प्लेटफार्मों पर जियोफायर लाइब्रेरी को लागू करने के विकल्प के रूप में किया जा सकता है।
आप क्या सीखेंगे
- मौजूदा क्लाउड फ़ंक्शंस कोड कैसे लें और इसे वितरण योग्य फ़ायरबेस एक्सटेंशन में कैसे बदलें
-
extension.yaml
फ़ाइल कैसे सेट करें - किसी एक्सटेंशन में संवेदनशील स्ट्रिंग्स (एपीआई कुंजी) को कैसे स्टोर करें
- एक्सटेंशन के डेवलपर्स को उनकी आवश्यकताओं के अनुरूप इसे कॉन्फ़िगर करने की अनुमति कैसे दें
- एक्सटेंशन का परीक्षण और परिनियोजन कैसे करें
आपको किस चीज़ की ज़रूरत पड़ेगी
- फायरबेस सीएलआई (इंस्टॉल करें और लॉगिन करें)
- एक Google खाता, एक gmail खाते की तरह
- नोड.जेएस और
npm
- आपका पसंदीदा विकास वातावरण
2. स्थापित हो जाओ
कोड प्राप्त करें
इस एक्सटेंशन के लिए आपको जो कुछ भी चाहिए वह GitHub रेपो में है। आरंभ करने के लिए, कोड लें और इसे अपने पसंदीदा विकास परिवेश में खोलें।
- डाउनलोड की गई ज़िप फ़ाइल को अनपैक करें।
- आवश्यक निर्भरताएँ स्थापित करने के लिए,
functions
निर्देशिका में टर्मिनल खोलें औरnpm install
कमांड चलाएँ।
फायरबेस सेट करें
यह कोडलैब फायरबेस एमुलेटर के उपयोग को अत्यधिक प्रोत्साहित करता है। यदि आप वास्तविक फायरबेस प्रोजेक्ट के साथ एक्सटेंशन डेवलपमेंट का प्रयास करना चाहते हैं, तो फायरबेस प्रोजेक्ट बनाएं देखें। यह कोडलैब क्लाउड फ़ंक्शंस का उपयोग करता है, इसलिए यदि आप एमुलेटर के बजाय वास्तविक फायरबेस प्रोजेक्ट का उपयोग कर रहे हैं, तो आपको ब्लेज़ मूल्य निर्धारण योजना में अपग्रेड करने की आवश्यकता है।
क्या आप आगे बढ़ना चाहते हैं?
आप कोडलैब का पूर्ण संस्करण डाउनलोड कर सकते हैं। यदि आप रास्ते में फंस जाते हैं या यदि आप देखना चाहते हैं कि एक पूर्ण एक्सटेंशन कैसा दिखता है, तो GitHub रिपॉजिटरी की codelab-end
शाखा देखें या पूर्ण ज़िप डाउनलोड करें।
3. कोड की समीक्षा करें
- ज़िप फ़ाइल से
index.ts
फ़ाइल खोलें। ध्यान दें कि इसमें दो क्लाउड फ़ंक्शंस घोषणाएँ शामिल हैं।
ये कार्य क्या करते हैं?
इन डेमो फ़ंक्शंस का उपयोग जियोहैशिंग के लिए किया जाता है। वे एक समन्वय जोड़ी लेते हैं और उन्हें एक प्रारूप में बदल देते हैं जो फायरस्टोर में भौगोलिक प्रश्नों के लिए अनुकूलित है। फ़ंक्शन एपीआई कॉल के उपयोग का अनुकरण करते हैं ताकि आप एक्सटेंशन में संवेदनशील डेटा प्रकारों को संभालने के बारे में अधिक जान सकें। अधिक जानकारी के लिए, फायरस्टोर में डेटा पर जियो क्वेरी चलाने पर दस्तावेज़ देखें।
कार्य स्थिरांक
स्थिरांक को शुरुआत में ही, index.ts
फ़ाइल के शीर्ष पर घोषित किया जाता है। इनमें से कुछ स्थिरांक एक्सटेंशन के परिभाषित ट्रिगर्स में संदर्भित हैं।
Index.ts
import {firestore} from "firebase-functions";
import {initializeApp} from "firebase-admin/app";
import {GeoHashService, ResultStatusCode} from "./fake-geohash-service";
import {onCall} from "firebase-functions/v1/https";
import {fieldValueExists} from "./utils";
const documentPath = "users/{uid}";
const xField = "xv";
const yField = "yv";
const apiKey = "1234567890";
const outputField = "hash";
initializeApp();
const service = new GeoHashService(apiKey);
फायरस्टोर ट्रिगर
index.ts
फ़ाइल में पहला फ़ंक्शन इस तरह दिखता है:
Index.ts
export const locationUpdate = firestore.document(documentPath)
.onWrite((change) => {
// item deleted
if (change.after == null) {
return 0;
}
// double check that both values exist for computation
if (
!fieldValueExists(change.after.data(), xField) ||
!fieldValueExists(change.after.data(), yField)
) {
return 0;
}
const x: number = change.after.data()![xField];
const y: number = change.after.data()![yField];
const hash = service.convertToHash(x, y);
// This is to check whether the hash value has changed. If
// it hasn't, you don't want to write to the document again as it
// would create a recursive write loop.
if (fieldValueExists(change.after.data(), outputField)
&& change.after.data()![outputField] == hash) {
return 0;
}
return change.after.ref
.update(
{
[outputField]: hash.hash,
}
);
});
यह फ़ंक्शन एक फायरस्टोर ट्रिगर है। जब डेटाबेस में एक लेखन घटना होती है, तो फ़ंक्शन एक xv
फ़ील्ड और एक yv
फ़ील्ड की खोज करके उस घटना पर प्रतिक्रिया करता है, और, यदि वे दोनों फ़ील्ड मौजूद हैं, तो यह जियोहैश की गणना करता है और आउटपुट को एक निर्दिष्ट दस्तावेज़ आउटपुट स्थान पर लिखता है। इनपुट दस्तावेज़ को users/{uid}
स्थिरांक द्वारा परिभाषित किया गया है, जिसका अर्थ है कि फ़ंक्शन users/
संग्रह को लिखे गए प्रत्येक दस्तावेज़ को पढ़ता है और फिर उन दस्तावेज़ों के लिए जियोहैश संसाधित करता है। फिर यह हैश को उसी दस्तावेज़ में हैश फ़ील्ड में आउटपुट करता है।
कॉल करने योग्य कार्य
index.ts
फ़ाइल में अगला फ़ंक्शन इस तरह दिखता है:
Index.ts
export const callableHash = onCall((data, context) => {
if (context.auth == undefined) {
return {error: "Only authorized users are allowed to call this endpoint"};
}
const x = data[xField];
const y = data[yField];
if (x == undefined || y == undefined) {
return {error: "Either x or y parameter was not declared"};
}
const result = service.convertToHash(x, y);
if (result.status != ResultStatusCode.ok) {
return {error: `Something went wrong ${result.message}`};
}
return {result: result.hash};
});
onCall
फ़ंक्शन पर ध्यान दें। यह इंगित करता है कि यह फ़ंक्शन एक कॉल करने योग्य फ़ंक्शन है, जिसे आपके क्लाइंट एप्लिकेशन कोड के भीतर से कॉल किया जा सकता है। यह कॉल करने योग्य फ़ंक्शन x
और y
पैरामीटर लेता है और एक जियोहैश लौटाता है। हालाँकि इस फ़ंक्शन को सीधे इस कोडलैब में नहीं बुलाया जाएगा, इसे यहां फ़ायरबेस एक्सटेंशन में कॉन्फ़िगर करने के लिए किसी चीज़ के उदाहरण के रूप में शामिल किया गया है।
4. एक एक्सटेंशन.yaml फ़ाइल सेट करें
अब जब आप जानते हैं कि आपके एक्सटेंशन में क्लाउड फ़ंक्शंस कोड क्या करता है, तो आप इसे वितरण के लिए पैकेज करने के लिए तैयार हैं। प्रत्येक फायरबेस एक्सटेंशन एक extension.yaml
फ़ाइल के साथ आता है जो बताता है कि एक्सटेंशन क्या करता है और यह कैसे व्यवहार करता है।
एक extension.yaml
फ़ाइल को आपके एक्सटेंशन के बारे में कुछ प्रारंभिक मेटाडेटा की आवश्यकता होती है। निम्नलिखित में से प्रत्येक चरण आपको यह समझने में मदद करता है कि सभी फ़ील्ड का क्या अर्थ है और आपको उनकी आवश्यकता क्यों है।
- प्रोजेक्ट की रूट डायरेक्टरी में एक
extension.yaml
फ़ाइल बनाएं जिसे आपने पहले डाउनलोड किया था। निम्नलिखित जोड़कर प्रारंभ करें:
name: geohash-ext
version: 0.0.1
specVersion: v1beta # Firebase Extensions specification version (do not edit)
एक्सटेंशन का नाम एक्सटेंशन की इंस्टेंस आईडी के आधार के रूप में उपयोग किया जाता है (उपयोगकर्ता एक एक्सटेंशन के कई इंस्टेंस इंस्टॉल कर सकते हैं, प्रत्येक की अपनी आईडी होती है)। फिर फायरबेस उस इंस्टेंस आईडी का उपयोग करके एक्सटेंशन के सेवा खातों और एक्सटेंशन-विशिष्ट संसाधनों का नाम उत्पन्न करता है। संस्करण संख्या आपके एक्सटेंशन के संस्करण को इंगित करती है. इसे सिमेंटिक वर्जनिंग का पालन करना चाहिए, और जब भी आप एक्सटेंशन की कार्यक्षमता में बदलाव करते हैं तो आपको इसे अपडेट करना होगा। एक्सटेंशन विनिर्देश संस्करण का उपयोग यह निर्धारित करने के लिए किया जाता है कि किस फायरबेस एक्सटेंशन विनिर्देश का पालन किया जाए, इस मामले में, v1beta
का उपयोग किया जाता है।
- YAML फ़ाइल में कुछ उपयोगकर्ता-अनुकूल विवरण जोड़ें:
...
displayName: Latitude and longitude to GeoHash converter
description: A converter for changing your Latitude and longitude coordinates to geohashes.
जब डेवलपर्स आपके एक्सटेंशन के साथ इंटरैक्ट करते हैं तो डिस्प्ले नाम आपके एक्सटेंशन के नाम का एक अनुकूल प्रतिनिधित्व होता है। विवरण इस बात का संक्षिप्त विवरण देता है कि एक्सटेंशन क्या करता है। जब एक्सटेंशन एक्सटेंशन.dev पर तैनात किया जाता है, तो यह कुछ इस तरह दिखता है:
- अपने एक्सटेंशन में कोड के लिए लाइसेंस निर्दिष्ट करें।
...
license: Apache-2.0 # The license you want for the extension
- बताएं कि एक्सटेंशन किसने लिखा है और इसे इंस्टॉल करने के लिए बिलिंग की आवश्यकता है या नहीं:
...
author:
authorName: AUTHOR_NAME
url: https://github.com/Firebase
billingRequired: true
author
अनुभाग का उपयोग आपके उपयोगकर्ताओं को यह बताने के लिए किया जाता है कि यदि उन्हें एक्सटेंशन के साथ कोई समस्या आ रही है या वे इसके बारे में अधिक जानकारी चाहते हैं तो उन्हें किससे संपर्क करना चाहिए। billingRequired
एक आवश्यक पैरामीटर है और इसे true
पर सेट किया जाना चाहिए क्योंकि सभी एक्सटेंशन क्लाउड फ़ंक्शंस पर निर्भर करते हैं, जिसके लिए ब्लेज़ योजना की आवश्यकता होती है।
इसमें इस एक्सटेंशन की पहचान करने के लिए extension.yaml
फ़ाइल में आवश्यक फ़ील्ड की न्यूनतम संख्या शामिल है। अन्य पहचान संबंधी जानकारी के बारे में अधिक जानकारी के लिए जिसे आप एक्सटेंशन में निर्दिष्ट कर सकते हैं, दस्तावेज़ देखें।
5. क्लाउड फ़ंक्शंस कोड को एक्सटेंशन संसाधन में बदलें
एक एक्सटेंशन संसाधन एक आइटम है जिसे फायरबेस किसी एक्सटेंशन की स्थापना के दौरान प्रोजेक्ट में बनाता है। फिर एक्सटेंशन उन संसाधनों का स्वामी होता है और उसका एक विशिष्ट सेवा खाता होता है जो उन पर संचालित होता है। इस प्रोजेक्ट में, वे संसाधन क्लाउड फ़ंक्शंस हैं, जिन्हें extension.yaml
फ़ाइल में परिभाषित किया जाना चाहिए क्योंकि एक्सटेंशन फ़ंक्शंस फ़ोल्डर में कोड से स्वचालित रूप से संसाधन नहीं बनाएगा। यदि आपके क्लाउड फ़ंक्शंस को स्पष्ट रूप से संसाधन के रूप में घोषित नहीं किया गया है, तो एक्सटेंशन तैनात होने पर उन्हें तैनात नहीं किया जा सकता है।
उपयोगकर्ता-परिभाषित परिनियोजन स्थान
- उपयोगकर्ता को वह स्थान निर्दिष्ट करने की अनुमति दें जहां वे इस एक्सटेंशन को तैनात करना चाहते हैं और निर्णय लें कि एक्सटेंशन को उनके अंतिम उपयोगकर्ताओं के करीब होस्ट करना बेहतर होगा या उनके डेटाबेस के करीब।
extension.yaml
फ़ाइल में, स्थान चुनने का विकल्प शामिल करें।
एक्सटेंशन.yaml
अब आप फ़ंक्शन संसाधन के लिए कॉन्फ़िगरेशन लिखने के लिए तैयार हैं।
-
extension.yaml
फ़ाइल में,locationUpdate
फ़ंक्शन के लिए एक संसाधन ऑब्जेक्ट बनाएं। निम्नलिखित कोextension.yaml
फ़ाइल में जोड़ें:
resources:
- name: locationUpdate
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/users/{uid}
आप name
प्रोजेक्ट की index.ts
फ़ाइल में परिभाषित फ़ंक्शन नाम के रूप में परिभाषित करते हैं। आप तैनात किए जा रहे फ़ंक्शन के type
निर्दिष्ट करते हैं, जो अभी के लिए हमेशा firebaseextensions.v1beta.function
होना चाहिए। फिर, आप इस फ़ंक्शन के properties
परिभाषित करते हैं। आपके द्वारा परिभाषित पहली संपत्ति eventTrigger
है जो इस फ़ंक्शन से संबद्ध है। यह दिखाने के लिए कि एक्सटेंशन वर्तमान में क्या समर्थन करता है, आप providers/cloud.firestore/eventTypes/document.write
के eventType
का उपयोग करते हैं, जो आपके एक्सटेंशन दस्तावेज़ के लिए राइट क्लाउड फ़ंक्शंस में पाया जाता है। आप resource
दस्तावेज़ों के स्थान के रूप में परिभाषित करते हैं। चूंकि आपका वर्तमान लक्ष्य कोड में मौजूद चीज़ों को प्रतिबिंबित करना है, दस्तावेज़ पथ users/{uid}
को सुनता है, इसके पहले डिफ़ॉल्ट डेटाबेस स्थान होता है।
- एक्सटेंशन को फायरस्टोर डेटाबेस के लिए पढ़ने और लिखने की अनुमति की आवश्यकता है।
extension.yaml
फ़ाइल के बिल्कुल अंत में, उन IAM भूमिकाओं को निर्दिष्ट करें जिनकी डेवलपर के फायरबेस प्रोजेक्ट में डेटाबेस के साथ काम करने के लिए एक्सटेंशन तक पहुंच होनी चाहिए।
roles:
- role: datastore.user
reason: Allows the extension to read / write to your Firestore instance.
datastore.user
भूमिका एक्सटेंशन के लिए समर्थित IAM भूमिकाओं की सूची से आती है। चूंकि एक्सटेंशन पढ़ने और लिखने वाला है, इसलिए datastore.user
भूमिका यहां उपयुक्त है।
- कॉल करने योग्य फ़ंक्शन को भी जोड़ा जाना चाहिए।
extension.yaml
फ़ाइल में, resource प्रॉपर्टी के अंतर्गत एक नया संसाधन बनाएं। ये गुण कॉल करने योग्य फ़ंक्शन के लिए विशिष्ट हैं:
- name: callableHash
type: firebaseextensions.v1beta.function
properties:
httpsTrigger: {}
हालाँकि पिछले संसाधन में eventTrigger
का उपयोग किया गया था, यहाँ आप httpsTrigger
उपयोग करते हैं, जो कॉल करने योग्य फ़ंक्शंस और HTTPS फ़ंक्शंस दोनों को कवर करता है।
कोड जांच
यह आपके extension.yaml
आपकी index.ts
फ़ाइल में कोड द्वारा की गई हर चीज़ से मेल कराने के लिए बहुत सारी कॉन्फ़िगरेशन थी। इस समय पूर्ण extension.yaml
फ़ाइल इस प्रकार दिखनी चाहिए:
एक्सटेंशन.yaml
name: geohash-ext
version: 0.0.1
specVersion: v1beta # Firebase Extensions specification version (do not edit)
displayName: Latitude and Longitude to GeoHash converter
description: A converter for changing your Latitude and Longitude coordinates to geohashes.
license: Apache-2.0 # The license you want for the extension
author:
authorName: Sparky
url: https://github.com/Firebase
billingRequired: true
resources:
- name: locationUpdate
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/users/{uid}
- name: callableHash
type: firebaseextensions.v1beta.function
properties:
httpsTrigger: {}
roles:
- role: datastore.user
reason: Allows the extension to read / write to your Firestore instance.
स्थिति की जांच
इस बिंदु पर, आपके पास एक्सटेंशन सेट अप के प्रारंभिक कार्यात्मक टुकड़े हैं, इसलिए आप वास्तव में फायरबेस एमुलेटर का उपयोग करके इसे आज़मा सकते हैं!
- यदि आपने पहले से नहीं किया है, तो डाउनलोड किए गए एक्सटेंशन प्रोजेक्ट के फ़ंक्शन फ़ोल्डर में
npm run build
कॉल करें। - अपने होस्ट सिस्टम पर एक नई निर्देशिका बनाएं और उस निर्देशिका को
firebase init
उपयोग करके अपने फायरबेस प्रोजेक्ट से कनेक्ट करें।
cd .. mkdir sample-proj cd sample-proj firebase init --project=projectID-or-alias
This command creates a `firebase.json` file in the directory. In the following steps, you push the configuration specified in this file to Firebase.
- उसी निर्देशिका से,
firebase ext:install
चलाएँ।/path/to/extension
उस निर्देशिका के पूर्ण पथ से बदलें जिसमें आपकीextension.yaml
फ़ाइल है।
firebase ext:install /path/to/extension
This command does two things:
- यह आपको एक्सटेंशन इंस्टेंस के लिए कॉन्फ़िगरेशन निर्दिष्ट करने के लिए संकेत देता है, और यह एक
*.env
फ़ाइल बनाता है जिसमें इंस्टेंस के लिए कॉन्फ़िगरेशन जानकारी होती है। - यह आपके
firebase.json
केextensions
अनुभाग में एक्सटेंशन इंस्टेंस जोड़ता है। यह एक्सटेंशन संस्करण के लिए इंस्टेंस आईडी के मानचित्र के रूप में कार्य करता है। - चूँकि आप प्रोजेक्ट को स्थानीय रूप से तैनात कर रहे हैं, आप निर्दिष्ट कर सकते हैं कि आप Google क्लाउड सीक्रेट मैनेजर के बजाय एक स्थानीय फ़ाइल का उपयोग करना चाहेंगे।
- नए कॉन्फ़िगरेशन के साथ फायरबेस एमुलेटर प्रारंभ करें:
firebase emulators:start
-
emulators:start
चलाने के बाद, एमुलेटर के वेबव्यू में फायरस्टोर टैब पर जाएँ। -
users
संग्रह मेंxv
संख्या फ़ील्ड औरyv
संख्या फ़ील्ड के साथ एक दस्तावेज़ जोड़ें।
- यदि आप एक्सटेंशन स्थापित करने में सफल रहे, तो एक्सटेंशन दस्तावेज़ में
hash
नामक एक नया फ़ील्ड बनाता है।
विवादों से बचने के लिए सफाई करें
- एक बार जब आप परीक्षण कर लें, तो एक्सटेंशन को अनइंस्टॉल कर दें—आप एक्सटेंशन कोड को अपडेट करने जा रहे हैं और बाद में वर्तमान एक्सटेंशन के साथ टकराव नहीं करना चाहेंगे।
एक्सटेंशन एक ही एक्सटेंशन के कई संस्करणों को एक साथ इंस्टॉल करने की अनुमति देते हैं, इसलिए अनइंस्टॉल करके, आप सुनिश्चित करते हैं कि पहले से इंस्टॉल किए गए एक्सटेंशन के साथ कोई विरोध नहीं है।
firebase ext:uninstall geohash-ext
वर्तमान समाधान काम करता है, लेकिन जैसा कि परियोजना की शुरुआत में बताया गया है, किसी सेवा के साथ संचार अनुकरण करने के लिए एक हार्ड-कोडित एपीआई कुंजी है। आप मूल रूप से आपूर्ति की गई के बजाय अंतिम-उपयोगकर्ता की एपीआई कुंजी का उपयोग कैसे कर सकते हैं? पता लगाने के लिए पढ़ें।
6. एक्सटेंशन को उपयोगकर्ता द्वारा कॉन्फ़िगर करने योग्य बनाएं
कोडलैब में इस बिंदु पर, आपके पास एक एक्सटेंशन है जो आपके द्वारा पहले से लिखे गए कार्यों के ओपिनेटेड सेटअप के साथ उपयोग के लिए कॉन्फ़िगर किया गया है, लेकिन क्या होगा यदि आपका उपयोगकर्ता इंगित करने वाले फ़ील्ड के लिए y और x के बजाय अक्षांश और देशांतर का उपयोग करना चाहता है कार्तीय तल पर स्थान? साथ ही, आप अंतिम उपयोगकर्ता को आपूर्ति की गई एपीआई कुंजी का उपभोग करने के बजाय अपनी स्वयं की एपीआई कुंजी की आपूर्ति कैसे करवा सकते हैं? आप उस एपीआई के कोटा को तुरंत खत्म कर सकते हैं। इस स्थिति में, आप पैरामीटर सेट अप और उपयोग करते हैं।
extension.yaml
फ़ाइल में बुनियादी पैरामीटर परिभाषित करें
उन आइटमों को परिवर्तित करके प्रारंभ करें जिनके लिए डेवलपर्स के पास संभावित रूप से कस्टम कॉन्फ़िगरेशन हो सकता है। पहला XFIELD
और YFIELD
पैरामीटर होगा।
-
extension.yaml
फ़ाइल में, निम्न कोड जोड़ें, जोXFIELD
औरYFIELD
फ़ील्ड पैरामीटर का उपयोग करता है। ये पैरामीटर पहले से परिभाषितparams
YAML प्रॉपर्टी के अंदर रहते हैं:
एक्सटेंशन.yaml
params:
- param: XFIELD
label: The X Field Name
description: >-
The X Field is also known as the **longitude** value. What does
your Firestore instance refer to as the X value or the longitude
value. If no value is specified, the extension searches for
field 'xv'.
type: string
validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
validationErrorMessage: >-
The field can only contain uppercase or lowercase letter, numbers,
_, and . characters and must be less than 1500 bytes long. The field
must also not start with a number.
default: xv
required: false
immutable: false
example: xv
- param: YFIELD
label: The Y Field Name
description: >-
The Y Field is also known as the **latitude** value. What does
your Firestore instance refer to as the Y value or the latitude
value. If no value is specified, the extension searches for
field 'yv'.
type: string
validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
validationErrorMessage: >-
The field can only contain uppercase or lowercase letter, numbers,
_, and . characters and must be less than 1500 bytes long. The field
must also not start with a number.
default: yv
required: false
immutable: false
example: yv
- पैरा पैरामीटर को इस तरह से नाम देता है जो आपको, एक्सटेंशन निर्माता को दिखाई दे। पैरामीटर मान निर्दिष्ट करते समय बाद में इस मान का उपयोग करें।
- लेबल डेवलपर के लिए एक मानव-पठनीय पहचानकर्ता है जो उन्हें बताता है कि पैरामीटर क्या करता है।
- विवरण मूल्य का विस्तृत विवरण देता है। चूंकि यह मार्कडाउन का समर्थन करता है, यह अतिरिक्त दस्तावेज़ीकरण से लिंक हो सकता है, या यह उन शब्दों को हाइलाइट कर सकता है जो डेवलपर के लिए महत्वपूर्ण हो सकते हैं।
- प्रकार इनपुट तंत्र को परिभाषित करता है कि उपयोगकर्ता पैरामीटर मान कैसे सेट करेगा। कई प्रकार मौजूद हैं, जिनमें
string
,select
,multiSelect
,selectResource
औरsecret
शामिल हैं। इनमें से प्रत्येक विकल्प के बारे में अधिक जानने के लिए दस्तावेज़ देखें। - ValidationRegex डेवलपर प्रविष्टि को एक निश्चित रेगेक्स मान तक सीमित करता है (उदाहरण में यह यहां पाए गए सरल फ़ील्ड नाम दिशानिर्देशों पर आधारित है); और यदि वह विफल रहता है...
- ValidationErrorMessage डेवलपर को विफलता मान के बारे में सचेत करता है।
- यदि डेवलपर ने कोई पाठ इनपुट नहीं किया है तो डिफ़ॉल्ट मान क्या होगा।
- आवश्यक का मतलब है कि डेवलपर को कोई भी टेक्स्ट दर्ज करने की आवश्यकता नहीं है।
- अपरिवर्तनीय डेवलपर को इस एक्सटेंशन को अपडेट करने और इस मान को बदलने की अनुमति देता है। इस मामले में, डेवलपर को अपनी आवश्यकताएं बदलने पर फ़ील्ड नाम बदलने में सक्षम होना चाहिए।
- उदाहरण से यह अंदाज़ा मिलता है कि एक वैध इनपुट कैसा दिख सकता है।
यह समझने लायक बहुत कुछ था!
- एक विशेष पैरामीटर जोड़ने से पहले आपके पास
extension.yaml
फ़ाइल में जोड़ने के लिए तीन और पैरामीटर हैं।
- param: INPUTPATH
label: The input document to listen to for changes
description: >-
This is the document where you write an x and y value to. Once
that document has received a value, it notifies the extension to
calculate a geohash and store that in an output document in a certain
field. This accepts function [wildcard parameters](https://firebase.google.com/docs/functions/firestore-events#wildcards-parameters)
type: string
validationRegex: ^[^/]+(/[^/]*/[^/]*)*/[^/]+$
validationErrorMessage: >-
This must point to a document path, not a collection path from the root
of the database. It must also not start or end with a '/' character.
required: true
immutable: false
example: users/{uid}
- param: OUTPUTFIELD
label: Geohash field
description: >-
This specifies the field in the output document to store the geohash in.
type: string
validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
validationErrorMessage: >-
The field can only contain uppercase or lowercase letter, numbers,
_, and . characters and must be less than 1500 bytes long. The field
must also not start with a number.
required: false
default: hash
immutable: false
example: hash
संवेदनशील मापदंडों को परिभाषित करें
अब, आपको उपयोगकर्ता द्वारा निर्दिष्ट एपीआई कुंजी को प्रबंधित करने की आवश्यकता है। यह एक संवेदनशील स्ट्रिंग है जिसे फ़ंक्शन में सादे पाठ में संग्रहीत नहीं किया जाना चाहिए। इसके बजाय, इस मान को क्लाउड सीक्रेट मैनेजर में संग्रहीत करें। यह क्लाउड में एक विशेष स्थान है जो एन्क्रिप्टेड रहस्यों को संग्रहीत करता है, और उन्हें गलती से लीक होने से बचाता है। इसके लिए डेवलपर को इस सेवा के उपयोग के लिए भुगतान करना होगा, लेकिन यह उनकी एपीआई कुंजी पर सुरक्षा की एक अतिरिक्त परत जोड़ता है और संभावित रूप से धोखाधड़ी गतिविधि को सीमित करता है। उपयोगकर्ता दस्तावेज़ डेवलपर को सचेत करता है कि यह एक सशुल्क सेवा है, ताकि बिलिंग में कोई आश्चर्य न हो। कुल मिलाकर, उपयोग ऊपर उल्लिखित अन्य स्ट्रिंग संसाधनों के समान है। अंतर केवल उस प्रकार का है जिसे secret
कहा जाता है।
-
extension.yaml
फ़ाइल में, निम्नलिखित कोड जोड़ें:
एक्सटेंशन.yaml
- param: APIKEY
label: GeohashService API Key
description: >-
Your geohash service API Key. Since this is a demo, and not a real
service, you can use : 1234567890.
type: secret
required: true
immutable: false
पैरामीटर्स का उपयोग करने के लिए resource
विशेषताओं को अपडेट करें
जैसा कि पहले उल्लेख किया गया है, संसाधन (फ़ंक्शन नहीं) परिभाषित करता है कि संसाधन का अवलोकन कैसे किया जाता है, इसलिए नए पैरामीटर का उपयोग करने के लिए locationUpdate
संसाधन को अद्यतन करने की आवश्यकता है।
-
extension.yaml
फ़ाइल में, निम्नलिखित कोड जोड़ें:
एक्सटेंशन.yaml
## Change from this
- name: locationUpdate
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/users/{uid}]
## To this
- name: locationUpdate
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/${INPUTPATH}
extension.yaml
फ़ाइल की जाँच करें
-
extension.yaml
फ़ाइल की समीक्षा करें. यह कुछ इस तरह दिखना चाहिए:
एक्सटेंशन.yaml
name: geohash-ext
version: 0.0.1
specVersion: v1beta # Firebase Extensions specification version (do not edit)
displayName: Latitude and Longitude to GeoHash converter
description: A converter for changing your Latitude and Longitude coordinates to geohashes.
license: Apache-2.0 # The license you want to use for the extension
author:
authorName: Sparky
url: https://github.com/Firebase
billingRequired: true
params:
- param: XFIELD
label: The X Field Name
description: >-
The X Field is also known as the **longitude** value. What does
your Firestore instance refer to as the X value or the longitude
value. If you don't provide a value for this field, the extension will use 'xv' as the default value.
type: string
validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
validationErrorMessage: >-
The field can only contain uppercase or lowercase letter, numbers,
_, and . characters and must be less than 1500 bytes long. The field
must also not start with a number.
default: xv
required: false
immutable: false
example: xv
- param: YFIELD
label: The Y Field Name
description: >-
The Y Field is also known as the **latitude** value. What does
your Firestore instance refer to as the Y value or the latitude
Value. If you don't provide a value for this field, the extension will use 'yv' as the default value.
type: string
validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
validationErrorMessage: >-
The field can only contain uppercase or lowercase letter, numbers,
_, and . characters and must be less than 1500 bytes long. The field
must also not start with a number.
default: yv
required: false
immutable: false
example: yv
- param: INPUTPATH
label: The input document to listen to for changes
description: >-
This is the document where you write an x and y value to. Once
that document has been modified, it notifies the extension to
compute a geohash and store that in an output document in a certain
field. This accepts function [wildcard parameters](https://firebase.google.com/docs/functions/firestore-events#wildcards-parameters)
type: string
validationRegex: ^[^/]+(/[^/]*/[^/]*)*/[^/]+$
validationErrorMessage: >-
This must point to a document path, not a collection path from the root
of the database. It must also not start or end with a '/' character.
required: true
immutable: false
example: users/{uid}
- param: OUTPUTFIELD
label: Geohash field
description: >-
This specifies the field in the output document to store the geohash in.
type: string
validationRegex: ^\D([0-9a-zA-Z_.]{0,375})$
validationErrorMessage: >-
The field can only contain uppercase or lowercase letter, numbers,
_, and . characters and must be less than 1500 bytes long. The field
must also not start with a number.
required: false
default: hash
immutable: false
example: hash
- param: APIKEY
label: GeohashService API Key
description: >-
Your geohash service API Key. Since this is a demo, and not a real
service, you can use : 1234567890.
type: secret
required: true
immutable: false
resources:
- name: locationUpdate
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/${INPUTPATH}
- name: callableHash
type: firebaseextensions.v1beta.function
properties:
httpsTrigger: {}
roles:
- role: datastore.user
reason: Allows the extension to read / write to your Firestore instance.
कोड में एक्सेस पैरामीटर
अब जब सभी पैरामीटर extension.yaml
फ़ाइल में कॉन्फ़िगर हो गए हैं, तो उन्हें index.ts
फ़ाइल में जोड़ें।
-
index.ts
फ़ाइल में, डिफ़ॉल्ट मानों कोprocess.env.PARAMETER_NAME
से बदलें, जो उचित पैरामीटर मान प्राप्त करता है और उन्हें डेवलपर के फायरबेस प्रोजेक्ट पर तैनात फ़ंक्शन कोड में पॉप्युलेट करता है।
Index.ts
// Replace this:
const documentPath = "users/{uid}";
const xField = "xv";
const yField = "yv";
const apiKey = "1234567890";
const outputField = "hash";
// with this:
const documentPath = process.env.INPUTPATH!; // this value is ignored since its read from the resource
const xField = process.env.XFIELD!;
const yField = process.env.YFIELD!;
const apiKey = process.env.APIKEY!;
const outputField = process.env.OUTPUTFIELD!;
आम तौर पर, आप पर्यावरण चर मानों के साथ शून्य जांच करना चाहते हैं, लेकिन इस मामले में, आप भरोसा करते हैं कि पैरामीटर मान सही ढंग से कॉपी किए गए हैं। कोड अब एक्सटेंशन पैरामीटर के साथ काम करने के लिए कॉन्फ़िगर किया गया है।
7. उपयोगकर्ता दस्तावेज़ बनाएं
एमुलेटर पर या फायरबेस एक्सटेंशन मार्केटप्लेस पर कोड का परीक्षण करने से पहले, एक्सटेंशन को दस्तावेजित करने की आवश्यकता होती है ताकि डेवलपर्स को पता चले कि एक्सटेंशन का उपयोग करने पर उन्हें क्या मिल रहा है।
-
PREINSTALL.md
फ़ाइल बनाकर प्रारंभ करें, जिसका उपयोग कार्यक्षमता, स्थापना के लिए किसी भी पूर्वापेक्षा और संभावित बिलिंग निहितार्थ का वर्णन करने के लिए किया जाता है।
प्रीइंस्टॉल.md
Use this extension to automatically convert documents with a latitude and
longitude to a geohash in your database. Additionally, this extension includes a callable function that allows users to make one-time calls
to convert an x,y coordinate into a geohash.
Geohashing is supported for latitudes between 90 and -90 and longitudes
between 180 and -180.
#### Third Party API Key
This extension uses a fictitious third-party API for calculating the
geohash. You need to supply your own API keys. (Since it's fictitious,
you can use 1234567890 as an API key).
#### Additional setup
Before installing this extension, make sure that you've [set up a Cloud
Firestore database](https://firebase.google.com/docs/firestore/quickstart) in your Firebase project.
After installing this extension, you'll need to:
- Update your client code to point to the callable geohash function if you
want to perform arbitrary geohashes.
Detailed information for these post-installation tasks are provided after
you install this extension.
#### Billing
To install an extension, your project must be on the [Blaze (pay as you
go) plan](https://firebase.google.com/pricing)
- This extension uses other Firebase and Google Cloud Platform services,
which have associated charges if you exceed the service's no-cost tier:
- Cloud Firestore
- Cloud Functions (Node.js 16+ runtime. [See
FAQs](https://firebase.google.com/support/faq#extensions-pricing))
- [Cloud Secret Manager](https://cloud.google.com/secret-manager/pricing)
- इस प्रोजेक्ट के लिए
README.md
लिखने में समय बचाने के लिए, सुविधा विधि का उपयोग करें:
firebase ext:info . --markdown > README.md
यह आपकी PREINSTALL.md
फ़ाइल की सामग्री और आपके extension.yaml
फ़ाइल से आपके एक्सटेंशन के बारे में अतिरिक्त विवरण को जोड़ता है।
अंत में, एक्सटेंशन के डेवलपर को अभी इंस्टॉल किए गए एक्सटेंशन के संबंध में कुछ अतिरिक्त विवरणों के बारे में सूचित करें। इंस्टॉलेशन पूरा करने के बाद डेवलपर को कुछ अतिरिक्त निर्देश और जानकारी मिल सकती है और यहां क्लाइंट कोड सेट करने जैसे कुछ विस्तृत पोस्ट-इंस्टॉलेशन कार्य भी मिल सकते हैं।
- एक
POSTINSTALL.md
फ़ाइल बनाएं, और उसके बाद निम्नलिखित इंस्टॉलेशन जानकारी शामिल करें:
POSTINSTALL.md
Congratulations on installing the geohash extension!
#### Function information
* **Firestore Trigger** - ${function:locationUpdate.name} was installed
and is invoked when both an x field (${param:XFIELD}) and y field
(${param:YFIELD}) contain a value.
* **Callable Trigger** - ${function:callableHash.name} was installed and
can be invoked by writing the following client code:
```javascript
import { getFunctions, httpsCallable } from "firebase/functions";
const functions = getFunctions();
const geoHash = httpsCallable(functions, '${function:callableHash.name}');
geoHash({ ${param:XFIELD}: -122.0840, ${param:YFIELD}: 37.4221 })
.then((result) => {
// Read result of the Cloud Function.
/** @type {any} */
const data = result.data;
const error = data.error;
if (error != null) {
console.error(`callable error : ${error}`);
}
const result = data.result;
console.log(result);
});
निगरानी
सर्वोत्तम अभ्यास के रूप में, आप अपने इंस्टॉल किए गए एक्सटेंशन की गतिविधि की निगरानी कर सकते हैं, जिसमें उसके स्वास्थ्य, उपयोग और लॉग की जांच भी शामिल है।
The output rendering looks something like this when it's deployed:
<img src="img/82b54a5c6ca34b3c.png" alt="A preview of the latitude and longitude geohash converter extension in the firebase console" width="957.00" />
## Test the extension with the full configuration
Duration: 03:00
It's time to make sure that the user-configurable extension is working the way it is intended.
* Change into the functions folder and ensure that the latest compiled version of the extensions exists. In the extensions project functions directory, call:
```console
npm run build
यह फ़ंक्शंस को पुन: संकलित करता है ताकि नवीनतम स्रोत कोड एक्सटेंशन के साथ तैनाती के लिए तैयार हो जब इसे एमुलेटर या सीधे फ़ायरबेस पर तैनात किया जाए।
इसके बाद, एक्सटेंशन का परीक्षण करने के लिए एक नई निर्देशिका बनाएं। चूंकि एक्सटेंशन मौजूदा फ़ंक्शंस से विकसित किया गया था, इसलिए उस फ़ोल्डर से परीक्षण न करें जिसमें एक्सटेंशन कॉन्फ़िगर किया गया था क्योंकि वह इसके साथ फ़ंक्शंस और फ़ायरबेस नियमों को तैनात करने का भी प्रयास करता है।
फायरबेस एमुलेटर के साथ इंस्टॉल करें और परीक्षण करें
- अपने होस्ट सिस्टम पर एक नई निर्देशिका बनाएं और उस निर्देशिका को
firebase init
उपयोग करके अपने फायरबेस प्रोजेक्ट से कनेक्ट करें।
mkdir sample-proj cd sample-proj firebase init --project=projectID-or-alias
- उस निर्देशिका से, एक्सटेंशन इंस्टॉल करने के लिए
firebase ext:install
चलाएँ।/path/to/extension
उस निर्देशिका के पूर्ण पथ से बदलें जिसमें आपकीextension.yaml
फ़ाइल है। यह आपके एक्सटेंशन के लिए इंस्टॉलेशन प्रक्रिया शुरू करता है और एक.env
फ़ाइल बनाता है जिसमें कॉन्फ़िगरेशन को फ़ायरबेस या एमुलेटर पर भेजने से पहले आपकी कॉन्फ़िगरेशन शामिल होती है।
firebase ext:install /path/to/extension
- चूंकि आप प्रोजेक्ट को स्थानीय रूप से तैनात कर रहे हैं, इसलिए निर्दिष्ट करें कि आप Google क्लाउड सीक्रेट मैनेजर के बजाय एक स्थानीय फ़ाइल का उपयोग करना चाहेंगे।
- स्थानीय एमुलेटर सुइट प्रारंभ करें:
firebase emulators:start
वास्तविक फायरबेस प्रोजेक्ट के साथ इंस्टॉल करें और परीक्षण करें
आप अपने एक्सटेंशन को वास्तविक फायरबेस प्रोजेक्ट में इंस्टॉल कर सकते हैं। आपके परीक्षण के लिए एक परीक्षण परियोजना का उपयोग करने की अनुशंसा की जाती है। यदि आप अपने एक्सटेंशन के एंड-टू-एंड प्रवाह का परीक्षण करना चाहते हैं या यदि आपके एक्सटेंशन का ट्रिगर अभी तक फायरबेस एमुलेटर सूट द्वारा समर्थित नहीं है ( एक्सटेंशन एमुलेटर विकल्प देखें) तो इस परीक्षण वर्कफ़्लो का उपयोग करें। एमुलेटर वर्तमान में क्लाउड फायरस्टोर, रीयलटाइम डेटाबेस और पब/सब के लिए HTTP अनुरोध-ट्रिगर फ़ंक्शंस और पृष्ठभूमि ईवेंट-ट्रिगर फ़ंक्शंस का समर्थन करते हैं।
- अपने होस्ट सिस्टम पर एक नई निर्देशिका बनाएं और उस निर्देशिका को
firebase init
उपयोग करके अपने फायरबेस प्रोजेक्ट से कनेक्ट करें।
cd .. mkdir sample-proj cd sample-proj firebase init --project=projectID-or-alias
- फिर, उस निर्देशिका से, एक्सटेंशन इंस्टॉल करने के लिए
firebase ext:install
चलाएँ।/path/to/extension
उस निर्देशिका के पूर्ण पथ से बदलें जिसमें आपकीextension.yaml
फ़ाइल है। यह आपके एक्सटेंशन के लिए इंस्टॉलेशन प्रक्रिया शुरू करता है और एक.env
फ़ाइल बनाता है जिसमें कॉन्फ़िगरेशन को फ़ायरबेस या एमुलेटर पर भेजने से पहले आपकी कॉन्फ़िगरेशन शामिल होती है।
firebase ext:install /path/to/extension
- चूँकि आप सीधे फायरबेस पर तैनात करना चाहते हैं, और Google क्लाउड सीक्रेट मैनेजर का उपयोग करना चाहते हैं, आपको एक्सटेंशन इंस्टॉल करने से पहले सीक्रेट मैनेजर एपीआई को सक्रिय करना होगा।
- अपने फायरबेस प्रोजेक्ट पर तैनात करें।
firebase deploy
एक्सटेंशन का परीक्षण करें
-
firebase deploy
याfirebase emulators:start
चलाने के बाद, जैसा उपयुक्त हो, फ़ायरबेस कंसोल या एमुलेटर के वेबव्यू के फ़ायरस्टोर टैब पर जाएँ। -
x
फ़ील्ड औरy
फ़ील्ड द्वारा निर्दिष्ट संग्रह में एक दस्तावेज़ जोड़ें। इस मामले में, अद्यतन दस्तावेज़xv
केx
फ़ील्ड औरyv
केy
फ़ील्ड के साथu/{uid}
पर स्थित हैं।
- यदि आप एक्सटेंशन स्थापित करने में सफल रहे, तो आपके द्वारा दो फ़ील्ड सहेजने के बाद एक्सटेंशन दस्तावेज़ में
hash
नामक एक नया फ़ील्ड बनाता है।
8. बधाई हो!
आपने अपने पहले क्लाउड फ़ंक्शन को फ़ायरबेस एक्सटेंशन में सफलतापूर्वक परिवर्तित कर लिया है!
आपने एक extension.yaml
फ़ाइल जोड़ी है और इसे कॉन्फ़िगर किया है ताकि डेवलपर्स यह चुन सकें कि वे आपके एक्सटेंशन को कैसे तैनात करना चाहते हैं। फिर आपने उपयोगकर्ता दस्तावेज़ बनाया जो यह मार्गदर्शन प्रदान करता है कि एक्सटेंशन के डेवलपर्स को एक्सटेंशन स्थापित करने से पहले क्या करना चाहिए और एक्सटेंशन को सफलतापूर्वक स्थापित करने के बाद उन्हें क्या कदम उठाने की आवश्यकता हो सकती है।
अब आप फायरबेस फ़ंक्शन को वितरण योग्य फायरबेस एक्सटेंशन में बदलने के लिए आवश्यक मुख्य चरणों को जानते हैं।