في كثير من الأحيان، ستحتاج إلى إعدادات إضافية لوظائفك، مثل مفاتيح واجهة برمجة التطبيقات التابعة لجهات خارجية أو الإعدادات القابلة للتعديل. توفّر حزمة تطوير البرامج (SDK) الخاصة بـ FirebaseCloud Functions إعدادات مدمجة للبيئة لتسهيل تخزين هذا النوع من البيانات واسترجاعه لمشروعك.
يمكنك الاختيار من بين الخيارات التالية:
- الإعدادات المحدّدة المَعلمات (يُنصح بها في معظم السيناريوهات) يوفّر ذلك إعدادات بيئة ذات أنواع محددة بوضوح مع مَعلمات يتم التحقّق من صحتها في وقت النشر، ما يمنع حدوث أخطاء ويبسّط عملية تصحيح الأخطاء.
- الإعداد المستند إلى الملفات لمتغيّرات البيئة: باستخدام هذا الأسلوب، يمكنك إنشاء ملف dotenv يدويًا لتحميل متغيّرات البيئة.
في معظم حالات الاستخدام، يُنصح باستخدام الإعدادات التي تتضمّن مَعلمات، لأنّ هذا الأسلوب يتيح استخدام قيم الإعدادات في وقت التشغيل ووقت النشر، كما يتم حظر النشر ما لم تتضمّن جميع المَعلمات قيمة صالحة. في المقابل، لا تتوفّر الإعدادات التي تتضمّن متغيرات بيئية في وقت النشر.
الإعدادات التي تتضمّن مَعلمات
توفّر Cloud Functions for Firebase واجهة لتحديد مَعلمات الإعداد بشكل تصريحي داخل قاعدة الرموز البرمجية. وتتوفّر قيمة هذه المَعلمات أثناء نشر الدوال، وعند ضبط خيارات النشر ووقت التشغيل، وأثناء التنفيذ. وهذا يعني أنّ واجهة سطر الأوامر ستمنع عملية النشر ما لم تكن جميع المَعلمات تتضمّن قيمة صالحة.
لتحديد المَعلمات في الرمز، اتّبِع النموذج التالي:
const functions = require('firebase-functions/v1');
const { defineInt, defineString } = require('firebase-functions/params');
// Define some parameters
const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
const welcomeMessage = defineString('WELCOME_MESSAGE');
// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
عند نشر دالة تتضمّن متغيّرات إعدادات ذات مَعلمات، يحاول Firebase CLI أولاً تحميل قيمها من ملفات .env محلية. وإذا لم تكن هذه القيم متوفّرة في تلك الملفات ولم يتم ضبط default، سيطلب منك CLI إدخال القيم أثناء عملية النشر، ثم سيحفظها تلقائيًا في ملف .env باسم .env.<project_ID> في الدليل functions/:
$ firebase deploy
i functions: preparing codebase default for deployment
? Enter a string value for ENVIRONMENT: prod
i functions: Writing new parameter values to disk: .env.projectId
…
$ firebase deploy
i functions: Loaded environment variables from .env.projectId
استنادًا إلى سير عمل التطوير، قد يكون من المفيد إضافة ملف .env.<project_ID> الذي تم إنشاؤه إلى نظام التحكم في الإصدارات.
استخدام المَعلمات في النطاق العام
أثناء عملية النشر، يتم تحميل رمز الدوال وفحصه قبل أن تتضمّن المَعلمات قيمًا فعلية، ما يعني أنّ جلب قيم المَعلمات أثناء النطاق العام يؤدي إلى تعذُّر عملية النشر. في الحالات التي تريد فيها استخدام مَعلمة لتهيئة قيمة عامة، استخدِم دالة معاودة الاتصال الخاصة بعملية التهيئة onInit(). يتم تنفيذ دالة معاودة الاتصال هذه قبل تنفيذ أي دوال في مرحلة الإنتاج، ولكن لا يتم استدعاؤها أثناء عملية النشر، لذا فهي مكان آمن للوصول إلى قيمة المَعلمة.
const { GoogleGenerativeAI } = require('@google/generative-ai');
const { defineSecret } = require('firebase-functions/params');
const { onInit } = require('firebase-functions/v1');
const apiKey = defineSecret('GOOGLE_API_KEY');
let genAI;
onInit(() => {
genAI = new GoogleGenerativeAI(apiKey.value());
})
ضبط سلوك واجهة سطر الأوامر
يمكن ضبط المَعلمات باستخدام كائن Options يتحكّم في الطريقة التي سيطلب بها واجهة سطر الأوامر القيم. يضبط المثال التالي الخيارات للتحقّق من صحة تنسيق رقم الهاتف، ولتوفير خيار تحديد بسيط، ولتعبئة خيار تحديد تلقائيًا من مشروع Firebase:
const { defineString } = require('firebase-functions/params');
const welcomeMessage = defineString('WELCOME_MESSAGE', {default: 'Hello World',
description: 'The greeting that is returned to the caller of this function'});
const onlyPhoneNumbers = defineString('PHONE_NUMBER', {input: {text:
{validationRegex: /\d{3}-\d{3}-\d{4}/, validationErrorMessage: "Please enter
a phone number in the format XXX-YYY-ZZZZ"}}});
const selectedOption = defineString('PARITY', {input: {select: {options:
[{value: "odd"}, {value: "even"}]}}})
const storageBucket = defineString('BUCKET', {input: {resource: {type:
"storage.googleapis.com/Bucket"}}, description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets"})
أنواع المَعلمات
يوفّر الإعداد المحدّد المَعلمات كتابة قوية لقيم المَعلمات، ويتوافق أيضًا مع الأسرار من Cloud Secret Manager. الأنواع المتوافقة هي:
- سري
- سلسلة
- قيمة منطقية
- عدد صحيح
- عائم
راجِع مرجع مساحة الاسم params
للحصول على معلومات حول الدوال المستخدَمة لتحديد المَعلمات.
قيم المَعلمات والعبارات
يقيّم Firebase المَعلمات في وقت النشر وأثناء تنفيذ الدالة. ونظرًا إلى هذه البيئات المزدوجة، يجب توخّي الحذر عند مقارنة قيم المَعلمات وعند استخدامها لضبط خيارات وقت التشغيل للدوال.
لتمرير مَعلمة إلى الدالة كخيار وقت التشغيل، مرِّرها مباشرةً:
const functions = require('firebase-functions/v1');
const { defineInt} = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
(req, res) => {
//…
بالإضافة إلى ذلك، إذا كنت بحاجة إلى المقارنة بمَعلمة لمعرفة الخيار الذي يجب اختياره، عليك استخدام أدوات المقارنة المضمّنة بدلاً من التحقّق من القيمة:
const functions = require('firebase-functions/v1');
const { defineBool } = require('firebase-functions/params');
const environment = params.defineString(‘ENVIRONMENT’, {default: ‘dev’});
// use built-in comparators
const minInstancesConfig =environment.equals('PRODUCTION').thenElse(10, 1);
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
(req, res) => {
//…
يمكن الوصول إلى المَعلمات وتعبيرات المَعلمات التي يتم استخدامها فقط في وقت التشغيل باستخدام الدالة value الخاصة بها:
const functions = require('firebase-functions/v1');
const { defineString } = require('firebase-functions/params');
const welcomeMessage = defineString('WELCOME_MESSAGE');
// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = functions.https.onRequest(
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
المَعلمات المضمَّنة
تقدّم حزمة تطوير البرامج (SDK) الخاصة بـ "وظائف السحابة الإلكترونية" ثلاث مَعلمات محدّدة مسبقًا، وهي متاحة من الحزمة الفرعية firebase-functions/params:
-
projectID: مشروع على السحابة الإلكترونية الذي يتم تشغيل الدالة فيه -
databaseURL: عنوان URL لمثيل قاعدة بيانات الوقت الفعلي المرتبط بالدالة (في حال تفعيلها في مشروع Firebase). -
storageBucket: حزمة Cloud Storage المرتبطة بالدالة (في حال تفعيلها في مشروع Firebase)
تعمل هذه الدوال مثل مَعلمات السلسلة التي يحددها المستخدم من جميع النواحي، باستثناء أنّه بما أنّ قيمها معروفة دائمًا لواجهة Firebase CLI، لن تتم مطالبتك بإدخال قيمها عند النشر ولن يتم حفظها في ملفات .env.
المَعلمات السرّية
تمثّل المَعلمات من النوع Secret، والمحدّدة باستخدام defineSecret()، مَعلمات السلسلة التي يتم تخزين قيمتها في Cloud Secret Manager. بدلاً من التحقّق من ملف .env محلي وكتابة قيمة جديدة في الملف في حال عدم توفّره، تتحقّق مَعلمات المفتاح السرّي من توفّرها في Cloud Secret Manager، وتطلب بشكل تفاعلي قيمة مفتاح سرّي جديد أثناء عملية النشر.
يجب ربط المَعلمات السرية المحدّدة بهذه الطريقة بدوال فردية يجب أن يكون لديها إذن الوصول إليها:
const functions = require('firebase-functions/v1');
const { defineSecret } = require('firebase-functions/params');
const discordApiKey = defineSecret('DISCORD_API_KEY');
export const postToDiscord = functions.runWith({ secrets: [discordApiKey] }).https.onRequest(
(req, res) => {
const apiKey = discordApiKey.value();
//…
متغيرات البيئة
تتيح Cloud Functions for Firebase استخدام تنسيق ملفات
dotenv
لتحميل متغيرات البيئة المحدّدة في ملف .env إلى وقت تشغيل التطبيق. بعد النشر، يمكن قراءة متغيرات البيئة من خلال واجهة
process.env.
لضبط بيئتك بهذه الطريقة، أنشئ ملف .env في مشروعك، وأضِف المتغيرات المطلوبة، ثم نفِّذ عملية النشر:
أنشئ ملف
.envفي دليلfunctions/:# Directory layout: # my-project/ # firebase.json # functions/ # .env # package.json # index.jsافتح ملف
.envللتعديل، وأضِف المفاتيح المطلوبة. على سبيل المثال:PLANET=Earth AUDIENCE=Humansنشر الدوال والتحقّق من تحميل متغيّرات البيئة:
firebase deploy --only functions # ... # i functions: Loaded environment variables from .env. # ...
بعد نشر متغيرات البيئة المخصّصة، يمكن لرمز الدالة الوصول إليها باستخدام بنية process.env:
// Responds with "Hello Earth and Humans"
exports.hello = functions.https.onRequest((request, response) => {
response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`);
});
نشر مجموعات متعدّدة من متغيّرات البيئة
إذا كنت بحاجة إلى مجموعة بديلة من متغيرات البيئة لمشاريع Firebase (مثل مرحلة الاختبار مقابل مرحلة الإنتاج)، أنشئ ملف .env.<project or
alias> واكتب فيه متغيرات البيئة الخاصة بمشروعك. سيتم تضمين متغيّرات البيئة من الملفات .env و.env الخاصة بالمشروع (إذا كانت متوفّرة) في جميع الدوال التي تم نشرها.
على سبيل المثال، يمكن أن يتضمّن المشروع الملفات الثلاثة التالية التي تحتوي على قيم مختلفة قليلاً للتطوير والإنتاج:
.env
|
.env.dev
|
.env.prod
|
| PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Prod Humans |
بالنظر إلى القيم في هذه الملفات المنفصلة، ستختلف مجموعة متغيرات البيئة التي يتم نشرها مع الدوال حسب المشروع المستهدف:
$ firebase use dev
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.dev.
# Deploys functions with following user-defined environment variables:
# PLANET=Earth
# AUDIENCE=Dev Humans
$ firebase use prod
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.prod.
# Deploys functions with following user-defined environment variables:
# PLANET=Earth
# AUDIENCE=Prod Humans
متغيرات البيئة المحجوزة
بعض مفاتيح متغيّرات البيئة محجوزة للاستخدام الداخلي، لذا لا تستخدِم أيًا من هذه المفاتيح في ملفات .env:
- جميع المفاتيح التي تبدأ بـ X_GOOGLE_
- جميع المفاتيح التي تبدأ بـ EXT_
- جميع المفاتيح التي تبدأ بـ FIREBASE_
- أي مفتاح من القائمة التالية:
- CLOUD_RUNTIME_CONFIG
- ENTRY_POINT
- GCP_PROJECT
- GCLOUD_PROJECT
- GOOGLE_CLOUD_PROJECT
- FUNCTION_TRIGGER_TYPE
- FUNCTION_NAME
- FUNCTION_MEMORY_MB
- FUNCTION_TIMEOUT_SEC
- FUNCTION_IDENTITY
- FUNCTION_REGION
- FUNCTION_TARGET
- FUNCTION_SIGNATURE_TYPE
- K_SERVICE
- K_REVISION
- PORT
- K_CONFIGURATION
تخزين معلومات الإعدادات الحساسة والوصول إليها
يمكن استخدام متغيّرات البيئة المخزَّنة في ملفات .env لإعداد الدوال، ولكن لا يجب اعتبارها طريقة آمنة لتخزين المعلومات الحسّاسة، مثل بيانات اعتماد قواعد البيانات أو مفاتيح واجهة برمجة التطبيقات. ويُعدّ ذلك مهمًا بشكل خاص إذا كنت تتحقّق من ملفات .env في نظام التحكّم بالمصادر.
لمساعدتك في تخزين معلومات الضبط الحسّاسة، تتكامل Cloud Functions for Firebase مع Google Cloud Secret Manager. تخزِّن هذه الخدمة المشفرة قيم الضبط بشكل آمن، مع السماح بالوصول إليها بسهولة من الدوال عند الحاجة.
إنشاء سرّ واستخدامه
لإنشاء سرّ، استخدِم واجهة سطر الأوامر Firebase.
لإنشاء سرّ واستخدامه، اتّبِع الخطوات التالية:
نفِّذ الأمر التالي من جذر دليل مشروعك على جهاز المستخدم:
firebase functions:secrets:set SECRET_NAME
أدخِل قيمة لـ SECRET_NAME.
تعرض واجهة سطر الأوامر رسالة نجاح وتحذّر من أنّه يجب نشر الدوال حتى يسري التغيير.
قبل النشر، تأكَّد من أنّ رمز الدوال يتيح للدالة الوصول إلى كلمة المرور السرية باستخدام المَعلمة
runWith:exports.processPayment = functions // Make the secret available to this function .runWith({ secrets: ["SECRET_NAME"] }) .onCall((data, context) => { const myBillingService = initializeBillingService( // reference the secret value process.env.SECRET_NAME ); // Process the payment });نشر Cloud Functions:
firebase deploy --only functions
يمكنك الآن الوصول إليه مثل أي متغير بيئة آخر.
في المقابل، إذا حاولت دالة أخرى لا تحدّد كلمة المرور في runWith الوصول إلى كلمة المرور، ستتلقّى قيمة غير محدّدة:
exports.anotherEndpoint = functions.https.onRequest((request, response) => {
response.send(`The secret API key is ${process.env.SECRET_NAME}`);
// responds with "The secret API key is undefined" because the `runWith` parameter is missing
});
بعد نشر الدالة، سيصبح بإمكانها الوصول إلى قيمة كلمة المرور. يمكن فقط للدوال التي تتضمّن سرًا في المَعلمة runWith الوصول إلى هذا السر كمتغيّر بيئة. يساعدك ذلك في التأكّد من أنّ قيم الأسرار متاحة فقط عند الحاجة إليها، ما يقلّل من خطر تسريب سرّ عن طريق الخطأ.
إدارة المفاتيح السرية
استخدِم واجهة سطر الأوامر Firebase لإدارة الأسرار. عند إدارة الأسرار بهذه الطريقة، يُرجى العِلم أنّ بعض التغييرات في واجهة سطر الأوامر تتطلّب تعديل و/أو إعادة نشر الدوال المرتبطة، وتحديدًا:
- عندما تحدّد قيمة جديدة لمفتاح سرّي، عليك إعادة نشر جميع الدوال التي تشير إلى هذا المفتاح السرّي لكي تستخدم أحدث قيمة.
- إذا حذفت سرًا، تأكَّد من أنّ أيًا من الدوال التي تم نشرها لا يشير إلى هذا السر، لأنّ الدوال التي تستخدم قيمة سرية تم حذفها ستتوقف عن العمل بدون إظهار أي خطأ.
في ما يلي ملخّص لأوامر واجهة سطر الأوامر Firebase لإدارة الأسرار:
# Change the value of an existing secret firebase functions:secrets:set SECRET_NAME # View the value of a secret functions:secrets:access SECRET_NAME # Destroy a secret functions:secrets:destroy SECRET_NAME # View all secret versions and their state functions:secrets:get SECRET_NAME # Automatically clean up all secrets that aren't referenced by any of your functions functions:secrets:prune
بالنسبة إلى الأمرَين access وdestroy، يمكنك تقديم مَعلمة الإصدار الاختيارية لإدارة إصدار معيّن. على سبيل المثال:
functions:secrets:access SECRET_NAME[@VERSION]
لمزيد من المعلومات حول هذه العمليات، أضِف -h إلى الأمر لعرض مساعدة واجهة سطر الأوامر.
كيفية احتساب تكلفة المفاتيح السرية
تسمح Secret Manager بوجود 6 إصدارات نشطة من المفتاح السري بدون أي تكلفة. وهذا يعني أنّه يمكنك الحصول على 6 أسرار شهريًا في مشروع Firebase بدون أي تكلفة.
يحاول Firebase CLI تلقائيًا إتلاف إصدارات البيانات السرية غير المستخدَمة عند الاقتضاء، مثلاً عند نشر دوال باستخدام إصدار جديد من البيانات السرية. يمكنك أيضًا إزالة الأسرار غير المستخدَمة بشكل نشط باستخدام
functions:secrets:destroy وfunctions:secrets:prune.
تسمح Secret Manager بإجراء 10,000 عملية وصول شهرية غير مدفوعة التكلفة إلى سر. لا تقرأ مثيلات الدوال سوى الأسرار المحدّدة في الخيار secrets
في كل مرة تبدأ فيها التشغيل البارد. إذا كان لديك الكثير من مثيلات الدوال التي تقرأ الكثير من الأسرار، قد يتجاوز مشروعك هذا الحد المسموح به، وفي هذه الحالة سيتم تحصيل 0.03 دولار أمريكي مقابل كل 10,000 عملية وصول.
لمزيد من المعلومات، اطّلِع على Secret Manager الأسعار.
التوافق مع المحاكي
تم تصميم إعدادات البيئة باستخدام dotenv لتعمل مع Cloud Functions محاكي محلي.
عند استخدام Cloud Functions محاكي محلي، يمكنك تجاهل متغيرات البيئة لمشروعك من خلال إعداد ملف .env.local. يتم منح الأولوية لمحتوى .env.local على .env وملف .env الخاص بالمشروع.
على سبيل المثال، يمكن أن يتضمّن المشروع الملفات الثلاثة التالية التي تحتوي على قيم مختلفة قليلاً للتطوير والاختبار المحلي:
.env
|
.env.dev
|
.env.local
|
| PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Local Humans |
عند بدء المحاكي في السياق المحلي، يتم تحميل متغيرات البيئة كما هو موضّح أدناه:
$ firebase emulators:start
i emulators: Starting emulators: functions
# Starts emulator with following environment variables:
# PLANET=Earth
# AUDIENCE=Local Humans
الأسرار وبيانات الاعتماد في محاكي Cloud Functions
يتيح محاكي Cloud Functions استخدام الأسرار من أجل تخزين معلومات الإعدادات الحساسة والوصول إليها. سيحاول المحاكي تلقائيًا الوصول إلى أسرار الإنتاج باستخدام بيانات الاعتماد التلقائية للتطبيق. في بعض الحالات، مثل بيئات التكامل المستمر، قد يتعذّر على المحاكي الوصول إلى قيم الأسرار بسبب قيود الأذونات.
على غرار Cloud Functions إتاحة المحاكي للمتغيرات البيئية، يمكنك إلغاء قيم الأسرار من خلال إعداد ملف .secret.local، ما يسهّل عليك اختبار الدوال محليًا، خاصةً إذا لم يكن بإمكانك الوصول إلى قيمة السر.
النقل من إعدادات وقت التشغيل
تم إيقاف واجهة برمجة التطبيقات functions.config نهائيًا في مارس 2027.
بعد هذا التاريخ، ستتعذّر عمليات النشر التي تتضمّن functions.config.
لمنع حدوث أخطاء في عملية النشر، ننصحك بنقل إعداداتك إلى Cloud Secret Manager باستخدام واجهة سطر الأوامر Firebase. ننصحك بشدة باتّباع هذه الطريقة لأنّها الأكثر فعالية وأمانًا لنقل إعداداتك.
إعدادات التصدير باستخدام واجهة سطر الأوامر Firebase
استخدِم الأمر
config exportلتصدير إعدادات بيئتك الحالية إلى سر جديد في Cloud Secret Manager:$ firebase functions:config:export i This command retrieves your Runtime Config values (accessed via functions.config()) and exports them as a Secret Manager secret. i Fetching your existing functions.config() from your project... ✔ Fetched your existing functions.config(). i Configuration to be exported: ⚠ This may contain sensitive data. Do not share this output. { ... } ✔ What would you like to name the new secret for your configuration? RUNTIME_CONFIG ✔ Created new secret version projects/project/secrets/RUNTIME_CONFIG/versions/1```تعديل رمز الدالة لربط الأسرار
لاستخدام الإعدادات المخزَّنة في المفتاح السري الجديد في Cloud Secret Manager، استخدِم واجهة برمجة التطبيقات
defineJsonSecretفي مصدر الدالة. تأكَّد أيضًا من ربط الأسرار بجميع الدوال التي تحتاج إليها.قبل
const functions = require("firebase-functions/v1"); exports.myFunction = functions.https.onRequest((req, res) => { const apiKey = functions.config().someapi.key; // ... });بعد
const { onRequest } = require("firebase-functions/v2/https"); const { defineJsonSecret } = require("firebase-functions/params"); const config = defineJsonSecret("RUNTIME_CONFIG"); exports.myFunction = onRequest( // Bind secret to your function { secrets: [config] }, (req, res) => { // Access secret values via .value() const apiKey = config.value().someapi.key; // ... });تفعيل الوظائف
انشر وظائفك المعدَّلة لتطبيق التغييرات وربط أذونات البيانات السرية.
firebase deploy --only functions:<your-function-name>
متغيرات البيئة التي تتم تعبئتها تلقائيًا
تتوفّر متغيرات بيئة يتم ملؤها تلقائيًا في وقت تشغيل الدوال وفي الدوال المحاكية محليًا، وتشمل المتغيرات التي يتم ملؤها بواسطة Google Cloud، بالإضافة إلى متغير بيئة خاص بـ Firebase:
process.env.FIREBASE_CONFIG: يوفّر معلومات إعدادات مشروع Firebase التالية:
{
databaseURL: 'https://DATABASE_NAME.firebaseio.com',
storageBucket: 'PROJECT_ID.firebasestorage.app ',
projectId: 'PROJECT_ID'
}
يُرجى العِلم أنّ القيم في إعدادات Firebase الفعلية قد تختلف حسب الموارد التي وفّرتها في مشروعك.
يتم تطبيق هذا الإعداد تلقائيًا عند تهيئة حزمة تطوير البرامج (SDK) الخاصة بـ Firebase Admin بدون وسيطات. إذا كنت تكتب دوالاً بلغة JavaScript، يمكنك تهيئتها على النحو التالي:
const admin = require('firebase-admin');
admin.initializeApp();
إذا كنت تكتب دوالاً في TypeScript، يمكنك تهيئتها على النحو التالي:
import * as functions from 'firebase-functions/v1';
import * as admin from 'firebase-admin';
import 'firebase-functions/v1';
admin.initializeApp();
إذا كنت بحاجة إلى تهيئة مدير SDK باستخدام إعدادات المشروع التلقائية باستخدام بيانات اعتماد حساب الخدمة، يمكنك تحميل بيانات الاعتماد من ملف وإضافتها إلى FIREBASE_CONFIG على النحو التالي:
serviceAccount = require('./serviceAccount.json');
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);