ضبط البيئة


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

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

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

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

الإعدادات باستخدام مَعلمة

توفّر وظائف السحابة الإلكترونية لبرنامج 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، سيطلب واجهة سطر الأوامر القيم أثناء النشر، ثم تحفظ القيم تلقائيًا في ملف .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. الأنواع المتوافقة هي:

  • سري
  • String
  • منطقي
  • Integer
  • عائم

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

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

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

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

  • projectID: مشروع Cloud الذي يتم فيه تشغيل الدالة
  • 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
PLANET=الأرض

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

الجمهور=فريق مطوّري البرامج 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
  • مشروع_Google Cloud Platform
  • مشروع GCLOUD
  • مشروع GOOGLE_CLOUD
  • FUNCTION_TRIGGER_TYPE
  • الدالة FUNCTION_NAME
  • FUNCTION_MEMORY_ميغابايت
  • الدالة FUNCTION_🔐_SEC
  • الدالة FUNCTION_IDENTITY
  • FUNCTION_ AR
  • الدالة FUNCTION_TARGET
  • الوظيفة_SIGNATURE_TYPE
  • خدمة K_SERVICE
  • المراجعة_K
  • المنفذ
  • الإعداد كيه

تخزين معلومات الإعداد الحساسة والوصول إليها

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

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

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

لإنشاء واجهة برمجة تطبيقات سرّية، استخدِم واجهة سطر الأوامر (CLI) في 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 إصدارات سرية نشطة بدون أي تكلفة. هذا يعني أنّه يمكنك الاحتفاظ بـ 6 أسرار شهريًا في أي مشروع على Firebase بدون أي تكلفة

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

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

لمزيد من المعلومات، يُرجى الاطّلاع على أسعار المدير السري.

إتاحة المحاكي

تم تصميم إعدادات البيئة باستخدام dotenv للتشغيل التفاعلي مع محاكي Cloud Functions المحلي.

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

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

.env .env.dev .env.local
PLANET=الأرض

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

الجمهور=فريق مطوّري البرامج الجمهور=أشخاص محليون

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

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

على سبيل المثال، لتخزين Client ID ومفتاح واجهة برمجة التطبيقات لـ "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');
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، يمكنك كتابة ما يلي:

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);