ضبط البيئة


ستحتاج غالبًا إلى ضبط إضافي للدوال، مثل مفاتيح واجهة برمجة التطبيقات التابعة لجهات خارجية أو الإعدادات القابلة للضبط. توفّر حزمة Firebase SDK لنظام التشغيل Cloud 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.`);
  }
);

عند نشر دالة باستخدام متغيّرات إعدادات مستندة إلى مَعلمات، يحاول ملف IDE لـ Firebase أولاً تحميل قيمها من ملفات ‎.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> الذي تم إنشاؤه إلى نظام التحكّم في الإصدارات.

استخدام المَعلمات في النطاق العام

أثناء عملية النشر، يتم تحميل رمز الدوالّ وفحصه قبل أن تحصل paramter على قيم فعلية. وهذا يعني أنّ جلب قيم المَعلمات أثناء النطاق العام يؤدي إلى تعذُّر النشر. في الحالات التي تريد فيها استخدام مَعلمة لإعداد قيمة عالمية، استخدِم دالة الاستدعاء لإعداد القيمة 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 يتحكّم في كيفية طلب CLI للقيم. يحدِّد المثال التالي خيارات للتحقّق من تنسيق رقم الهاتف، وتوفير خيار اختيار بسيط، و preenchimento خيار اختيار تلقائيًا من مشروع 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"})

أنواع المَعلمات

توفّر الإعدادات المُعرَّفة بالمَعلمات كتابة قوية لقيم المَعلمات، ويسمح أيضًا بالسرّية من "أداة إدارة الأسرار في السحابة الإلكترونية". الأنواع المتوافقة هي:

  • سري
  • سلسلة
  • منطقي
  • العدد الصحيح
  • عائم

قيم المَعلمات وتعبيراتها

تقيِّم 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) لوظائف Cloud ثلاث مَعلمات محدّدة مسبقًا، وهي متاحة من الحزمة الفرعية firebase-functions/params:

  • projectID: مشروع Cloud الذي يتم فيه تشغيل الدالة
  • databaseURL: عنوان URL لمثيل "قاعدة بيانات فورية الاستجابة" المرتبط بالدالة (إذا كان مفعّلاً في مشروع Firebase)
  • storageBucket: حزمة Cloud Storage المرتبطة بالدالة (في حال تفعيلها في مشروع Firebase)

تعمل هذه الدوالّ مثل مَعلمات سلاسل ملفوظة تحدّدها المستخدم من جميع النواحي، باستثناء أنّه لن يُطلب منك أبدًا إدخال قيمها عند النشر ولن يتم حفظها في ملفات .env، لأنّ قيمها معروفة دائمًا لتطبيق Firebase CLI.

المَعلمات السرية

تمثّل المَعلمات من النوع Secret، التي يتم تحديدها باستخدام defineSecret()، مَعلمات سلاسل تحتوي على قيمة مخزّنة في أداة "إدارة الأسرار في السحابة الإلكترونية". بدلاً من التحقّق من ملف .env محلي وكتابة قيمة جديدة في الملف في حال عدم توفّره، تتحقّق مَعلمات المفتاح السري من توفّره في أداة "إدارة مفاتيح المرور في السحابة الإلكترونية"، وتطلب بشكل تفاعلي قيمة مفتاح سري جديد أثناء عملية النشر.

يجب ربط المَعلمات السرية المحدَّدة بهذه الطريقة بوظائف فردية يجب أن يكون بإمكانها الوصول إليها:

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 في مشروعك وإضافة المتغيّرات المطلوبة ونشر ما يلي:

  1. أنشِئ ملف .env في دليل functions/:

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. افتح ملف .env لتعديله وأضِف المفاتيح المطلوبة. على سبيل المثال:

    PLANET=Earth
    AUDIENCE=Humans
    
  3. يمكنك نشر الدوال والتأكّد من تحميل متغيّرات البيئة:

    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.

لإنشاء سرّ واستخدامه:

  1. من جذر دليل المشروع المحلي، شغِّل الأمر التالي:

    firebase functions:secrets:set SECRET_NAME

  2. أدخِل قيمة في حقل SECRET_NAME.

    يعكس واجهة سطر الأوامر رسالة نجاح، ويحذّرك من ضرورة نشر وظائف لكي يتمّ تطبيق التغيير.

  3. قبل النشر، تأكَّد من أنّ رمز الدوال يسمح للدالة بالوصول إلى السر باستخدام المَعلمة 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
      });
  4. نشر 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، يمكنك تقديم المَعلمة version الاختيارية لإدارة إصدار معيّن. على سبيل المثال:

functions:secrets:access SECRET_NAME[@VERSION]

للحصول على مزيد من المعلومات حول هذه العمليات، أدخِل -h باستخدام الأمر لعرض مساعدة واجهة سطر الأوامر.

كيفية تحصيل رسوم مفاتيح المرور

تسمح Secret Manager بـ 6 إصدارات فعالة من الأسرار بدون أي تكلفة. هذا يعني أنّه يمكنك الاحتفاظ بـ 6 أسرار شهريًا في أي مشروع على Firebase بدون أي تكلفة

تحاول أداة Firebase CLI تلقائيًا إتلاف إصدارات السر غير المستخدَمة عند الاقتضاء، مثل عند نشر الدوالّ باستخدام إصدار جديد من السر. يمكنك أيضًا إزالة المفاتيح السرّية غير المستخدَمة باستخدام functions:secrets:destroy وfunctions:secrets:prune.

يتيح Secret Manager 10,000 عملية وصول شهرية لم تتم فوترتها على الإطلاق. لا تقرأ مثيلات الدوال سوى المفاتيح السرّية المحدّدة في معلَمة runWith في كل مرة تعمل فيها على البارد. إذا كان لديك الكثير من نُسخ الدوالّ التي تقرأ الكثير من الأسرار، قد يتجاوز مشروعك هذا الحدّ المسموح به، وعندئذٍ سيتم تحصيل رسوم منك تبلغ 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 استخدام المفاتيح السرّية لتخزين معلومات الإعداد الحسّاسة والوصول إليها. سيحاول المحاكي الوصول إلى أسرار الإصدار العلني تلقائيًا باستخدام بيانات اعتماد التطبيق التلقائية. في بعض الحالات، مثل بيئات التطوير المتكامل (CI)، قد يتعذّر على المحاكي الوصول إلى القيم السرية بسبب قيود الأذونات.

على غرار توافق محاكي Cloud Functions مع متغيّرات البيئة، يمكنك تجاوز قيم الأسرار من خلال إعداد ملف .secret.local. يسهّل عليك ذلك اختبار الدوالّ على الجهاز، خاصةً إذا لم يكن لديك إذن بالوصول إلى القيمة السرية.

نقل البيانات من إعدادات البيئة

إذا كنت تستخدم إعدادات البيئة من خلال functions.config، يمكنك نقل الإعدادات الحالية كمتغيّرات للبيئة (بتنسيق dotenv). توفّر واجهة Firebase CLI أمر تصدير يعرض ملف الإعدادات لكل عنوان بديل أو مشروع مُدرَج في ملف .firebaserc في الدليل (في المثال أدناه، local وdev وprod) كملفات .env.

لنقل البيانات، يمكنك تصدير إعدادات البيئة الحالية باستخدام الأمر firebase functions:config:export:

firebase functions:config:export
i  Importing configs from projects: [project-0, project-1]
⚠  The following configs keys could not be exported as environment variables:

⚠  project-0 (dev):
    1foo.a => 1FOO\_A (Key 1FOO\_A must start with an uppercase ASCII letter or underscore, and then consist of uppercase ASCII letters, digits, and underscores.)

Enter a PREFIX to rename invalid environment variable keys: CONFIG\_
✔  Wrote functions/.env.prod
✔  Wrote functions/.env.dev
✔  Wrote functions/.env.local
✔  Wrote functions/.env

يُرجى العِلم أنّه في بعض الحالات، سيُطلب منك إدخال بادئة لإعادة تسمية مفاتيح متغيّرات البيئة المُصدَّرة. ويعود السبب في ذلك إلى أنّه لا يمكن تحويل جميع الإعدادات تلقائيًا لأنّها قد تكون غير صالحة أو قد تكون مفتاح متغيّر بيئة محجوز.

ننصحك بمراجعة محتوى ملفات .env التي تم إنشاؤها بعناية قبل نشر الدوال أو التحقّق من ملفات .env في عنصر التحكّم في المصدر. إذا كانت أي قيم حسّاسة ويجب عدم تسريبها، عليك إزالتها من ملفاتك في .env وحفظها بأمان في Secret Manager بدلاً من ذلك.

ستحتاج أيضًا إلى تعديل رمز الدوالّ. وإذا كانت الدوال التي تستخدم functions.config ستحتاج الآن إلى استخدام process.env بدلاً من ذلك، على النحو الموضّح في القسم الترقية إلى الجيل الثاني.

ضبط البيئة

ضبط إعدادات البيئة باستخدام سطر الأوامر (CLI)

لتخزين بيانات البيئة، يمكنك استخدام الأمر firebase functions:config:set في Firebase واجهة سطر الأوامر. يمكن إنشاء مساحة اسم لكل مفتاح باستخدام النقاط لتجميع الإعدادات ذات الصلة معًا. يُرجى العلم أنّه يُسمح باستخدام الأحرف الصغيرة فقط في المفاتيح، ولا يُسمح باستخدام الأحرف الكبيرة.

على سبيل المثال، لتخزين معرّف العميل ومفتاح واجهة برمجة التطبيقات للخدمة "Some Service"، يمكنك تنفيذ ما يلي:

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

استرداد إعدادات البيئة الحالية

لفحص ما يتم تخزينه حاليًا في إعدادات البيئة لمشروعك، يمكنك استخدام firebase functions:config:get. وستؤدي هذه الأداة إلى إخراج JSON على النحو التالي:

{
  "someservice": {
    "key":"THE API KEY",
    "id":"THE CLIENT ID"
  }
}

تستند هذه الوظيفة إلى واجهة برمجة التطبيقات Google Cloud Runtime Configuration API.

استخدام functions.config للوصول إلى إعدادات البيئة في دالة

يتم توفير بعض الإعدادات تلقائيًا ضمن مساحة اسم firebase المحجوزة. تتوفّر إعدادات البيئة داخل وظيفتك التي تعمل من خلال functions.config(). لاستخدام الإعدادات أعلاه، قد يبدو الرمز على النحو التالي:

const functions = require('firebase-functions/v1');
const request = require('request-promise');

exports.userCreated = functions.database.ref('/users/{id}').onWrite(event => {
  let email = event.data.child('email').val();

  return request({
    url: 'https://someservice.com/api/some/call',
    headers: {
      'X-Client-ID': functions.config().someservice.id,
      'Authorization': `Bearer ${functions.config().someservice.key}`
    },
    body: {email: email}
  });
});

استخدام تهيئة البيئة لإعداد وحدة

بعض وحدات العقدة جاهزة بدون أي إعدادات. تحتاج الوحدات الأخرى إلى عملية برمجة إضافية لبدء التشغيل بشكل صحيح. ننصحك بتخزين هذا الإعداد في متغيرات تهيئة البيئة بدلاً من ترميزه الثابت. يساعدك ذلك في إبقاء رمزك البرمجي أكثر قابلية للنقل، ما يتيح لك فتح رمز تطبيقك البرمجي أو التبديل بسهولة بين الإصدارات العلنية والإصدارات التجريبية.

على سبيل المثال، لاستخدام وحدة Slack Node SDK، يمكنك كتابة ما يلي:

const functions = require('firebase-functions/v1');
const IncomingWebhook = require('@slack/client').IncomingWebhook;
const webhook = new IncomingWebhook(functions.config().slack.url);

قبل النشر، اضبط متغيّر إعدادات البيئة slack.url:

firebase functions:config:set slack.url=https://hooks.slack.com/services/XXX

أوامر إضافية للبيئة

  • firebase functions:config:unset key1 key2 تزيل المفاتيح المحدّدة من الإعدادات
  • firebase functions:config:clone --from <fromProject> تُنشئ نسخة طبق الأصل من بيئة مشروع آخر في المشروع النشط حاليًا.

متغيّرات البيئة التي تتم تعبئتها تلقائيًا

هناك متغيّرات بيئة تتم تعبئتها تلقائيًا في وقت تنفيذ الدوالّ وفي الدوالّ التي يتم محاكاتها محليًا. وتشمل هذه المتغيرات المتغيرات التي تمّت تعبئتها بواسطة Google Cloud، بالإضافة إلى متغيّر بيئة خاص بـ Firebase:

process.env.FIREBASE_CONFIG: يوفّر معلومات ضبط مشروع Firebase التالية:

{
  databaseURL: 'https://databaseName.firebaseio.com',
  storageBucket: 'projectId.appspot.com',
  projectId: 'projectId'
}

يتم تطبيق هذا الإعداد تلقائيًا عند بدء حزمة تطوير البرامج (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();

إذا كنت بحاجة إلى إعداد حزمة Admin SDK باستخدام إعدادات المشروع التلقائية باستخدام بيانات اعتماد حساب الخدمة، يمكنك تحميل بيانات الاعتماد من ملف و إضافتها إلى FIREBASE_CONFIG على النحو التالي:

serviceAccount = require('./serviceAccount.json');

const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);