ضبط البيئة


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

عند نشر دالة باستخدام متغيرات تهيئة المعلمة، يحاول واجهة سطر الأوامر في 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 الذي يتحكّم في طريقة واجهة سطر الأوامر ستظهر للقيم. يحدد المثال التالي خيارات للتحقق من صحة رقم الهاتف، ولتوفير خيار تحديد بسيط، تعبئة خيار تحديد تلقائيًا من مشروع 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 Projects
storage buckets"})

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

توفر التكوينات المعلمة كتابة قوية لقيم المعلمات، وتدعم أيضًا الأسرار من Cloud Secret Manager الأنواع المتوافقة هي:

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

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

تقيِّم 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.`);
  }
);

المعلمات المضمنة

توفِّر حزمة تطوير برامج Cloud Functions ثلاث معلَمات محدّدة مسبقًا، وهي متاحة من الحزمة الفرعية firebase-functions/params:

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

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

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

تمثل المعلمات من النوع 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 من واجهة pyplot.

لضبط بيئتك بهذه الطريقة، أنشئ ملف .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=الأرض

AUDIENCE=Humans

الجمهور=فريق مطوّري البرامج AUDIENCE=قسم الإنتاج

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

$ 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
  • FUNCTION_TRIGGER_TYPE
  • الدالة FUNCTION_NAME
  • FUNCTION_MEMORY_ميغابايت
  • FUNCTION_TIMEOUT_SEC
  • الدالة FUNCTION_IDENTITY
  • FUNCTION_REGION
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE
  • K_SERVICE
  • المراجعة_K
  • المنفذ
  • K_CONFIGURATION

تخزين معلومات الضبط الحسّاسة والوصول إليها

يمكن استخدام متغيّرات البيئة المخزّنة في ملفات .env لضبط ملف .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 تلقائيًا إزالة المفتاح السرّي غير المستخدَم تلقائيًا الإصدارات متى كان ذلك مناسبًا، مثل نشر الدوال مع إصدار جديد السر. يمكنك أيضًا إزالة الأسرار غير المستخدمة بشكل فعّال باستخدام "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=الأرض

AUDIENCE=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 CLI. يمكن إنشاء مساحة اسم لكل مفتاح باستخدام النقاط لتجميع الإعدادات ذات الصلة معًا. يُرجى العلم أنّه يُسمح باستخدام الأحرف الصغيرة فقط في المفاتيح، ولا يُسمح باستخدام الأحرف الكبيرة.

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

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'
}

يتم تطبيق هذه الإعدادات تلقائيًا عند إعداد Firebase. SDK للمشرف بدون وسيطات. إذا كنت تكتب دوالًا بلغة 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);