ابدأ: اكتب وظائفك الأولى واختبرها وانشرها


للبدء في استخدام وظائف السحابة، حاول العمل من خلال هذا البرنامج التعليمي، الذي يبدأ بمهام الإعداد المطلوبة ويعمل من خلال إنشاء وظيفتين مرتبطتين واختبارهما ونشرهما:

  • وظيفة "إضافة رسالة" تعرض عنوان URL الذي يقبل قيمة نصية ويكتبها في Cloud Firestore.
  • وظيفة "إنشاء أحرف كبيرة" يتم تشغيلها عند كتابة Cloud Firestore وتحويل النص إلى أحرف كبيرة.

إليك نموذج التعليمات البرمجية الكامل الذي يحتوي على الوظائف:

Node.js

// The Cloud Functions for Firebase SDK to create Cloud Functions and triggers.
const {logger} = require("firebase-functions");
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

// The Firebase Admin SDK to access Firestore.
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

initializeApp();

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addmessage = onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await getFirestore()
      .collection("messages")
      .add({original: original});
  // Send back a message that we've successfully written the message
  res.json({result: `Message with ID: ${writeResult.id} added.`});
});

// Listens for new messages added to /messages/:documentId/original
// and saves an uppercased version of the message
// to /messages/:documentId/uppercase
exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => {
  // Grab the current value of what was written to Firestore.
  const original = event.data.data().original;

  // Access the parameter `{documentId}` with `event.params`
  logger.log("Uppercasing", event.params.documentId, original);

  const uppercase = original.toUpperCase();

  // You must return a Promise when performing
  // asynchronous tasks inside a function
  // such as writing to Firestore.
  // Setting an 'uppercase' field in Firestore document returns a Promise.
  return event.data.ref.set({uppercase}, {merge: true});
});

بايثون

# The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
from firebase_functions import firestore_fn, https_fn

# The Firebase Admin SDK to access Cloud Firestore.
from firebase_admin import initialize_app, firestore
import google.cloud.firestore

app = initialize_app()


@https_fn.on_request()
def addmessage(req: https_fn.Request) -> https_fn.Response:
    """Take the text parameter passed to this HTTP endpoint and insert it into
    a new document in the messages collection."""
    # Grab the text parameter.
    original = req.args.get("text")
    if original is None:
        return https_fn.Response("No text parameter provided", status=400)

    firestore_client: google.cloud.firestore.Client = firestore.client()

    # Push the new message into Cloud Firestore using the Firebase Admin SDK.
    _, doc_ref = firestore_client.collection("messages").add({"original": original})

    # Send back a message that we've successfully written the message
    return https_fn.Response(f"Message with ID {doc_ref.id} added.")


@firestore_fn.on_document_created(document="messages/{pushId}")
def makeuppercase(event: firestore_fn.Event[firestore_fn.DocumentSnapshot | None]) -> None:
    """Listens for new documents to be added to /messages. If the document has
    an "original" field, creates an "uppercase" field containg the contents of
    "original" in upper case."""

    # Get the value of "original" if it exists.
    if event.data is None:
        return
    try:
        original = event.data.get("original")
    except KeyError:
        # No "original" field, so do nothing.
        return

    # Set the "uppercase" field.
    print(f"Uppercasing {event.params['pushId']}: {original}")
    upper = original.upper()
    event.data.reference.update({"uppercase": upper})

حول هذا البرنامج التعليمي

لقد اخترنا وظائف Cloud Firestore وHTTP لهذه العينة جزئيًا لأنه يمكن اختبار مشغلات الخلفية هذه بدقة من خلال Firebase Local Emulator Suite . تدعم مجموعة الأدوات هذه أيضًا مشغلات Realtime Database وCloud Storage وPubSub وAuth وHTTP القابلة للاستدعاء. يمكن اختبار الأنواع الأخرى من مشغلات الخلفية مثل مشغلات Remote Config وTestLab بشكل تفاعلي باستخدام مجموعات الأدوات غير الموضحة في هذه الصفحة.

توضح الأقسام التالية من هذا البرنامج التعليمي بالتفصيل الخطوات المطلوبة لإنشاء النموذج واختباره ونشره.

إنشاء مشروع Firebase

  1. في وحدة تحكم Firebase ، انقر فوق إضافة مشروع .

    • لإضافة موارد Firebase إلى مشروع Google Cloud حالي ، أدخل اسم المشروع الخاص به أو حدده من القائمة المنسدلة.

    • لإنشاء مشروع جديد، أدخل اسم المشروع المطلوب. يمكنك أيضًا تحرير معرف المشروع المعروض أسفل اسم المشروع بشكل اختياري.

  2. إذا طُلب منك، راجع شروط Firebase واقبلها.

  3. انقر فوق "متابعة" .

  4. (اختياري) قم بإعداد Google Analytics لمشروعك، مما يمكّنك من الحصول على تجربة مثالية باستخدام أي من منتجات Firebase التالية:

    إما أن تختار حساب Google Analytics موجودًا أو أن تقوم بإنشاء حساب جديد.

    إذا قمت بإنشاء حساب جديد، فحدد موقع تقارير Analytics ، ثم اقبل إعدادات مشاركة البيانات وشروط Google Analytics لمشروعك.

  5. انقر على إنشاء مشروع (أو إضافة Firebase ، إذا كنت تستخدم مشروع Google Cloud موجودًا).

يقوم Firebase تلقائيًا بتوفير الموارد لمشروع Firebase الخاص بك. عند اكتمال العملية، سيتم نقلك إلى صفحة النظرة العامة لمشروع Firebase الخاص بك في وحدة تحكم Firebase.

قم بإعداد بيئتك وFirebase CLI

Node.js

ستحتاج إلى بيئة Node.js لكتابة الوظائف، وستحتاج إلى Firebase CLI لنشر الوظائف في وقت تشغيل Cloud Functions. لتثبيت Node.js و npm ، يوصى باستخدام Node Version Manager .

بمجرد تثبيت Node.js وnpm، قم بتثبيت Firebase CLI عبر الطريقة المفضلة لديك. لتثبيت واجهة سطر الأوامر عبر npm، استخدم:

npm install -g firebase-tools

يؤدي هذا إلى تثبيت أمر firebase المتوفر عالميًا. إذا فشل الأمر، فقد تحتاج إلى تغيير أذونات npm . للتحديث إلى أحدث إصدار من firebase-tools ، أعد تشغيل نفس الأمر.

بايثون

ستحتاج إلى بيئة Python لكتابة الوظائف، وستحتاج إلى Firebase CLI لنشر الوظائف في وقت تشغيل Cloud Functions. نوصي باستخدام venv لعزل التبعيات. إصدارات بايثون 3.10 و3.11 مدعومة.

بمجرد تثبيت Python، قم بتثبيت Firebase CLI عبر الطريقة المفضلة لديك.

تهيئة مشروعك

عند تهيئة Firebase SDK for Cloud Functions، فإنك تقوم بإنشاء مشروع فارغ يحتوي على التبعيات وبعض نماذج التعليمات البرمجية البسيطة. إذا كنت تستخدم Node.js، فيمكنك اختيار إما TypeScript أو JavaScript لإنشاء الوظائف. ولأغراض هذا البرنامج التعليمي، ستحتاج أيضًا إلى تهيئة Cloud Firestore.

لتهيئة مشروعك:

  1. قم بتشغيل firebase login لتسجيل الدخول عبر المتصفح ومصادقة Firebase CLI.
  2. انتقل إلى دليل مشروع Firebase الخاص بك.
  3. قم بتشغيل firebase init firestore . في هذا البرنامج التعليمي، يمكنك قبول القيم الافتراضية عند مطالبتك بقواعد Firestore وملفات الفهرس. إذا لم تكن قد استخدمت Cloud Firestore في هذا المشروع بعد، فستحتاج أيضًا إلى تحديد وضع البدء والموقع لـ Firestore كما هو موضح في بدء استخدام Cloud Firestore .
  4. قم بتشغيل firebase init functions . تطالبك واجهة سطر الأوامر (CLI) باختيار قاعدة تعليمات برمجية موجودة أو تهيئة قاعدة جديدة وتسميتها. عندما تبدأ للتو، تكون قاعدة تعليمات برمجية واحدة في الموقع الافتراضي كافية؛ لاحقًا، مع توسع تنفيذك، قد ترغب في تنظيم الوظائف في قواعد التعليمات البرمجية .
  5. تمنحك واجهة سطر الأوامر هذه الخيارات لدعم اللغة:

    • جافا سكريبت
    • تايب سكريبت
    • بايثون

    في هذا البرنامج التعليمي، حدد JavaScript أو Python . للتأليف في TypeScript، راجع كتابة الدوال باستخدام TypeScript .

  6. تمنحك واجهة سطر الأوامر (CLI) خيارًا لتثبيت التبعيات. يعد هذا أمرًا آمنًا للرفض إذا كنت تريد إدارة التبعيات بطريقة أخرى.

بعد اكتمال هذه الأوامر بنجاح، يبدو هيكل مشروعك كما يلي:

Node.js

myproject
+- .firebaserc    # Hidden file that helps you quickly switch between
|                 # projects with `firebase use`
|
+- firebase.json  # Describes properties for your project
|
+- functions/     # Directory containing all your functions code
      |
      +- .eslintrc.json  # Optional file containing rules for JavaScript linting.
      |
      +- package.json  # npm package file describing your Cloud Functions code
      |
      +- index.js      # Main source file for your Cloud Functions code
      |
      +- node_modules/ # Directory where your dependencies (declared in
                        # package.json) are installed

بالنسبة إلى Node.js، يحتوي ملف package.json الذي تم إنشاؤه أثناء التهيئة على مفتاح مهم: "engines": {"node": "18"} . يحدد هذا إصدار Node.js الخاص بك لكتابة الوظائف ونشرها. يمكنك تحديد الإصدارات المدعومة الأخرى .

بايثون

myproject
+- .firebaserc    # Hidden file that helps you quickly switch between
|                 # projects with `firebase use`
|
+- firebase.json  # Describes properties for your project
|
+- functions/     # Directory containing all your functions code
      |
      +- main.py      # Main source file for your Cloud Functions code
      |
      +- requirements.txt  #  List of the project's modules and packages 
      |
      +- venv/ # Directory where your dependencies are installed

قم باستيراد الوحدات المطلوبة وتهيئة التطبيق

بعد الانتهاء من مهام الإعداد، يمكنك فتح الدليل المصدر والبدء في إضافة التعليمات البرمجية كما هو موضح في الأقسام التالية. بالنسبة لهذه العينة، يجب أن يقوم مشروعك باستيراد وحدات Cloud Functions وAdmin SDK. أضف أسطرًا مثل ما يلي إلى ملفك المصدر:

Node.js

// The Cloud Functions for Firebase SDK to create Cloud Functions and triggers.
const {logger} = require("firebase-functions");
const {onRequest} = require("firebase-functions/v2/https");
const {onDocumentCreated} = require("firebase-functions/v2/firestore");

// The Firebase Admin SDK to access Firestore.
const {initializeApp} = require("firebase-admin/app");
const {getFirestore} = require("firebase-admin/firestore");

initializeApp();

بايثون

# The Cloud Functions for Firebase SDK to create Cloud Functions and set up triggers.
from firebase_functions import firestore_fn, https_fn

# The Firebase Admin SDK to access Cloud Firestore.
from firebase_admin import initialize_app, firestore
import google.cloud.firestore

app = initialize_app()

تقوم هذه الأسطر بتحميل الوحدات المطلوبة وتهيئة مثيل تطبيق admin الذي يمكن من خلاله إجراء تغييرات على Cloud Firestore. أينما يتوفر دعم Admin SDK ، كما هو الحال بالنسبة لـ FCM والمصادقة وFirebase Realtime Database، فإنه يوفر طريقة قوية لدمج Firebase باستخدام وظائف السحابة.

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

إضافة وظيفة "إضافة رسالة".

بالنسبة لوظيفة "إضافة رسالة"، أضف هذه السطور إلى ملفك المصدر:

Node.js

// Take the text parameter passed to this HTTP endpoint and insert it into
// Firestore under the path /messages/:documentId/original
exports.addmessage = onRequest(async (req, res) => {
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into Firestore using the Firebase Admin SDK.
  const writeResult = await getFirestore()
      .collection("messages")
      .add({original: original});
  // Send back a message that we've successfully written the message
  res.json({result: `Message with ID: ${writeResult.id} added.`});
});

بايثون

@https_fn.on_request()
def addmessage(req: https_fn.Request) -> https_fn.Response:
    """Take the text parameter passed to this HTTP endpoint and insert it into
    a new document in the messages collection."""
    # Grab the text parameter.
    original = req.args.get("text")
    if original is None:
        return https_fn.Response("No text parameter provided", status=400)

    firestore_client: google.cloud.firestore.Client = firestore.client()

    # Push the new message into Cloud Firestore using the Firebase Admin SDK.
    _, doc_ref = firestore_client.collection("messages").add({"original": original})

    # Send back a message that we've successfully written the message
    return https_fn.Response(f"Message with ID {doc_ref.id} added.")

وظيفة "إضافة رسالة" هي نقطة نهاية HTTP. يؤدي أي طلب إلى نقطة النهاية إلى تمرير كائنات الطلب والاستجابة إلى معالج الطلب للنظام الأساسي الخاص بك ( onRequest() أو on_request ).

وظائف HTTP متزامنة (مماثلة للوظائف القابلة للاستدعاء )، لذا يجب عليك إرسال استجابة في أسرع وقت ممكن وتأجيل العمل باستخدام Cloud Firestore. تقوم وظيفة HTTP "إضافة رسالة" بتمرير قيمة نصية إلى نقطة نهاية HTTP وإدراجها في قاعدة البيانات ضمن المسار /messages/:documentId/original .

أضف وظيفة "جعل الأحرف الكبيرة".

بالنسبة لوظيفة "إنشاء أحرف كبيرة"، أضف هذه السطور إلى ملفك المصدر:

Node.js

// Listens for new messages added to /messages/:documentId/original
// and saves an uppercased version of the message
// to /messages/:documentId/uppercase
exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => {
  // Grab the current value of what was written to Firestore.
  const original = event.data.data().original;

  // Access the parameter `{documentId}` with `event.params`
  logger.log("Uppercasing", event.params.documentId, original);

  const uppercase = original.toUpperCase();

  // You must return a Promise when performing
  // asynchronous tasks inside a function
  // such as writing to Firestore.
  // Setting an 'uppercase' field in Firestore document returns a Promise.
  return event.data.ref.set({uppercase}, {merge: true});
});

بايثون

@firestore_fn.on_document_created(document="messages/{pushId}")
def makeuppercase(event: firestore_fn.Event[firestore_fn.DocumentSnapshot | None]) -> None:
    """Listens for new documents to be added to /messages. If the document has
    an "original" field, creates an "uppercase" field containg the contents of
    "original" in upper case."""

    # Get the value of "original" if it exists.
    if event.data is None:
        return
    try:
        original = event.data.get("original")
    except KeyError:
        # No "original" field, so do nothing.
        return

    # Set the "uppercase" field.
    print(f"Uppercasing {event.params['pushId']}: {original}")
    upper = original.upper()
    event.data.reference.update({"uppercase": upper})

يتم تنفيذ وظيفة "إنشاء أحرف كبيرة" عند الكتابة إلى Cloud Firestore، مما يحدد المستند الذي سيتم الاستماع إليه. لأسباب تتعلق بالأداء، يجب أن تكون محددًا قدر الإمكان.

تحيط الأقواس - على سبيل المثال، {documentId} - بـ "المعلمات"، وهي أحرف البدل التي تعرض بياناتها المطابقة في رد الاتصال. يقوم Cloud Firestore بتشغيل رد الاتصال عند إضافة رسائل جديدة.

في Node.js، تكون الوظائف المعتمدة على الأحداث مثل أحداث Cloud Firestore غير متزامنة. يجب أن تقوم وظيفة رد الاتصال بإرجاع إما null أو Object أو Promise . إذا لم تقم بإرجاع أي شيء، فستنتهي مهلة الوظيفة، مما يشير إلى وجود خطأ، وتتم إعادة المحاولة. راجع المزامنة وغير المتزامنة والوعود .

محاكاة تنفيذ وظائفك

يتيح لك Firebase Local Emulator Suite إنشاء التطبيقات واختبارها على جهازك المحلي بدلاً من نشرها في مشروع Firebase. يوصى بشدة بالاختبار المحلي أثناء التطوير، ويرجع ذلك جزئيًا إلى أنه يقلل من المخاطر الناجمة عن أخطاء الترميز التي قد تؤدي إلى تكبد تكلفة في بيئة الإنتاج (على سبيل المثال، حلقة لا نهائية).

لمحاكاة وظائفك:

  1. قم بتشغيل firebase emulators:start وتحقق من إخراج عنوان URL الخاص بـ Emulator Suite UI. يكون الإعداد الافتراضي هو localhost:4000 ، ولكن قد تتم استضافته على منفذ مختلف على جهازك. أدخل عنوان URL هذا في متصفحك لفتح Emulator Suite UI.

  2. تحقق من إخراج firebase emulators:start لعنوان URL لوظيفة HTTP. سيبدو مشابهًا لـ http://localhost:5001/MY_PROJECT/us-central1/addMessage ، باستثناء ما يلي:

    1. سيتم استبدال MY_PROJECT بمعرف المشروع الخاص بك.
    2. قد يكون المنفذ مختلفًا على جهازك المحلي.
  3. قم بإضافة سلسلة الاستعلام ?text=uppercaseme إلى نهاية عنوان URL الخاص بالوظيفة. يجب أن يبدو هذا كالتالي: http://localhost:5001/MY_PROJECT/us-central1/addMessage?text=uppercaseme . بشكل اختياري، يمكنك تغيير الرسالة "الأحرف الكبيرة" إلى رسالة مخصصة.

  4. قم بإنشاء رسالة جديدة عن طريق فتح عنوان URL في علامة تبويب جديدة في متصفحك.

  5. عرض تأثيرات الوظائف في Emulator Suite UI:

    1. في علامة التبويب "السجلات" ، من المفترض أن تشاهد سجلات جديدة تشير إلى تشغيل وظائف HTTP الخاصة بك بنجاح:

      i functions: Beginning execution of "addMessage"

      i functions: Beginning execution of "makeUppercase"

    2. في علامة التبويب Firestore ، من المفترض أن تشاهد مستندًا يحتوي على رسالتك الأصلية بالإضافة إلى النسخة المكتوبة بأحرف كبيرة من رسالتك (إذا كانت في الأصل "أحرف كبيرة"، فسترى "أحرف كبيرة").

نشر الوظائف في بيئة الإنتاج

بمجرد أن تعمل وظائفك بالشكل المطلوب في المحاكي، يمكنك المتابعة لنشرها واختبارها وتشغيلها في بيئة الإنتاج. ضع في اعتبارك أنه لكي يتم النشر في الإنتاج، يجب أن يكون مشروعك مدرجًا في خطة تسعير Blaze . راجع تسعير الوظائف السحابية .

لإكمال البرنامج التعليمي، قم بنشر وظائفك ثم قم بتنفيذها.

  1. قم بتشغيل هذا الأمر لنشر وظائفك:

     firebase deploy --only functions
     

    بعد تشغيل هذا الأمر، تقوم واجهة سطر أوامر Firebase بإخراج عنوان URL لأي نقاط نهاية لوظيفة HTTP. في المحطة الطرفية الخاصة بك، يجب أن ترى سطرًا مثل ما يلي:

    Function URL (addMessage): https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage
    

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

    إذا واجهت أخطاء في الوصول مثل "تعذر السماح بالوصول إلى المشروع"، فحاول التحقق من الاسم المستعار لمشروعك .

  2. باستخدام مخرجات URL بواسطة واجهة سطر الأوامر (CLI)، قم بإضافة معلمة استعلام نصي، وافتحها في المتصفح:

    https://us-central1-MY_PROJECT.cloudfunctions.net/addMessage?text=uppercasemetoo
    

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

بعد نشر الوظائف وتنفيذها، يمكنك عرض السجلات في وحدة تحكم Google Cloud . إذا كنت بحاجة إلى حذف وظائف في التطوير أو الإنتاج، فاستخدم Firebase CLI.

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

الخطوات التالية

في هذه الوثائق، يمكنك معرفة المزيد حول كيفية إدارة وظائف Cloud Functions بالإضافة إلى كيفية التعامل مع جميع أنواع الأحداث التي تدعمها Cloud Functions.

لمعرفة المزيد حول وظائف السحابة، يمكنك أيضًا القيام بما يلي: