إعداد بيئتك


وغالبًا ما ستحتاج إلى ضبط إضافي للدوالّ، مثل مفاتيح واجهة برمجة التطبيقات التابعة لجهات خارجية أو الإعدادات القابلة للضبط. توفِّر حزمة تطوير البرامج (SDK) لمنصّة Firebase لوظائف Cloud إعدادات بيئة مدمجة لتسهيل تخزين هذا النوع من البيانات واسترداده لمشروعك.

يمكنك الاختيار من بين ثلاثة خيارات:

  • الإعداد الذي يتضمّن مَعلمات (يُنصَح به في معظم السيناريوهات). يوفّر ذلك إعدادات بيئة جيدة الكتابة باستخدام معلَمات تم التحقّق من صحتها في وقت النشر، ما يمنع حدوث الأخطاء ويبسّط تصحيح الأخطاء.
  • ضبط متغيّرات البيئة استنادًا إلى الملفات باستخدام هذا النهج، يمكنك إنشاء ملف dotenv يدويًا لتحميل متغيرات البيئة.
  • ضبط بيئة وقت التشغيل باستخدام واجهة سطر الأوامر في Firebase وfunctions.config (وظائف السحابة الإلكترونية (الجيل الأول) فقط).

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

الإعدادات التي تتضمّن معلَمات

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

لتحديد معلمات في التعليمة البرمجية، اتبع النموذج التالي:

const functions = require('firebase-functions');
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 أولاً تحميل القيم من ملفات .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> الذي تم إنشاؤه إلى التحكّم في الإصدار.

ضبط سلوك واجهة سطر الأوامر

يمكن ضبط المَعلمات باستخدام كائن 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. الأنواع المتوافقة هي:

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

قيم وتعبيرات المعلّمات

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

لتمرير معلمة إلى دالتك كخيار وقت التشغيل، قم بتمريرها مباشرة:

const functions = require('firebase-functions');
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');
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');
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: المشروع على السحابة الإلكترونية الذي يتم تشغيل الدالة فيه.
  • databaseURL: عنوان URL لمثيل قاعدة بيانات الوقت الفعلي المرتبط بالدالة (في حال تفعيلها في مشروع Firebase).
  • storageBucket: حزمة Cloud Storage المرتبطة بالوظيفة (في حال تفعيلها في مشروع Firebase).

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

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

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

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

const functions = require('firebase-functions');
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();
    //…

نظرًا لأن قيم الأسرار تكون مخفية حتى تنفيذ الدالة، لا يمكنك استخدامها أثناء إعداد الدالة.

متغيرات البيئة

تتوافق الدوال السحابية لمنصة 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
الكوكب=الأرض

الجمهور=البشر

الجمهور=المطوِّرون الجمهور=أشخاص المنتجون

بالنظر إلى القيم الموجودة في تلك الملفات المنفصلة، ستختلف مجموعة متغيرات البيئة التي يتم نشرها مع الدوال بناءً على مشروعك المستهدف:

$ 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 للتحكم في المصدر.

لمساعدتك في تخزين معلومات الإعداد الحساسة، تتكامل وظائف السحابة الإلكترونية لبرنامج Firebase مع مدير السر في Google Cloud. وتخزِّن هذه الخدمة المشفرة قيم الإعداد بأمان، مع استمرار السماح بالوصول بسهولة إلى الدوال عند الحاجة.

إنشاء مفتاح سرّي واستخدامه

لإنشاء واجهة برمجة تطبيقات سرّية، استخدِم واجهة سطر الأوامر في 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. نشر دوال السحابة:

    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 باستخدام الأمر لعرض مساعدة واجهة سطر الأوامر.

كيفية فوترة الأسرار

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

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

يتيح "المدير السري" الوصول إلى 10,000 عملية وصول شهرية غير مدفوعة الأجر على أحد الأسرار. تقرأ مثيلات الدوال الأمور السرّية فقط المحدَّدة في معلَمة runWith في كل مرة يتم فيها التشغيل على البارد. إذا كان لديك الكثير من مثيلات الوظائف التي تقرأ الكثير من الأسرار، فقد يتجاوز مشروعك هذا المخصص، وعندها سيتم تحصيل 0.03 دولار منك لكل 10000 عملية وصول.

لمعرفة مزيد من المعلومات، يُرجى الاطّلاع على تسعير Secret Manager.

دعم المحاكي

تم تصميم إعداد البيئة باستخدام dotenv بحيث يتوافق مع محاكي دوال Cloud المحلي.

عند استخدام محاكي دوال السحابة الإلكترونية المحلي، يمكنك إلغاء متغيرات البيئة لمشروعك من خلال إعداد ملف .env.local. ويكون لمحتوى .env.local الأولوية على .env وملف .env الخاص بالمشروع.

على سبيل المثال، يمكن أن يتضمن مشروع ما هذه الملفات الثلاثة التي تحتوي على قيم مختلفة قليلاً للتطوير والاختبار المحلي:

.env .env.dev .env.local
الكوكب=الأرض

الجمهور=البشر

الجمهور=المطوِّرون الجمهور=المستخدمون المحليون

وعند بدئه في السياق المحلي، يحمِّل المحاكي متغيرات البيئة كما هو موضح:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

الأسرار وبيانات الاعتماد في محاكي دوال السحابة

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

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

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

إذا كنت تستخدم إعداد البيئة مع functions.config، يمكنك نقل الإعدادات الحالية كمتغيّرات للبيئة (بتنسيق dotenv). توفّر واجهة سطر الأوامر في Firebase أمر تصدير يؤدي إلى إنشاء كل اسم مستعار أو مشروع مُدرَج في ملف .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 وتخزينها بشكل آمن في أداة المدير السري بدلاً من ذلك.

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

إعدادات البيئة

قبل إطلاق دعم متغيرات البيئة في firebase-functions v3.18.0، كان استخدام functions.config() هو النهج المقترَح لضبط البيئة. لا يزال هذا النهج مدعومًا، لكننا نوصي جميع المشروعات الجديدة باستخدام متغيرات البيئة بدلاً من ذلك، حيث إنها أسهل في الاستخدام وتحسن إمكانية نقل التعليمات البرمجية.

ضبط إعدادات البيئة باستخدام واجهة سطر الأوامر

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

على سبيل المثال، لتخزين معرف العميل ومفتاح واجهة برمجة التطبيقات لـ "بعض الخدمات"، يمكنك تشغيل:

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.

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

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

const functions = require('firebase-functions');
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}
  });
});

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

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

على سبيل المثال، لاستخدام وحدة حزمة تطوير البرامج (SDK) في Slack Node، يمكنك كتابة ما يلي:

const functions = require('firebase-functions');
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 بدون وسيطات. إذا كنت تكتب الدوال في JavaScript، فابدأ على النحو التالي:

const admin = require('firebase-admin');
admin.initializeApp();

إذا كنت تكتب دوال في TypeScript، فاضبطها على النحو التالي:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import 'firebase-functions';
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);