البدء: كتابة الدوال الأولى واختبارها ونشرها


لبدء استخدام دوال Cloud، يُرجى محاولة مراجعة هذا البرنامج التعليمي، والذي يبدأ بمهام الإعداد المطلوبة ويعمل من خلال الإنشاء والاختبار ونشر دالتَين مرتبطتَين، وهما:

  • "إضافة رسالة" تعرض عنوان 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});
});

Python

# 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 التي يتم تشغيلها عبر HTTP أخذ عيّنة منه جزئيًا لأنّ هذه العوامل المُشغِّلة في الخلفية يمكن اختبارها بدقة من خلال حزمة أدوات المحاكاة المحلية من Firebase. مجموعة الأدوات هذه قاعدة بيانات الوقت الفعلي، وCloud Storage، مشغِّلات PubSub وAuth وHTTP القابلة للاستدعاء. الأنواع الأخرى من عوامل تشغيل الخلفية مثل التكوين عن بُعد ومشغلات TestLab يتم اختباره بشكل فعال باستخدام مجموعات أدوات الموضحة في هذه الصفحة.

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

إنشاء مشروع Firebase

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

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

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

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

  3. انقر على متابعة.

  4. (اختياري) يمكنك إعداد "إحصاءات Google" لمشروعك، ما تمكّنك من للحصول على أفضل تجربة باستخدام أيٍّ من منتجات Firebase التالية:

    يمكنك تحديد إما حساب "إحصاءات Google" أو إنشاء حساب جديد.

    إذا أنشأت حسابًا جديدًا، اختَر موقع إعداد تقارير "إحصاءات Google"، ثم قبول إعدادات مشاركة البيانات وبنود "إحصاءات Google" لمشروعك.

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

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

إعداد البيئة وواجهة سطر الأوامر في Firebase

Node.js

ستحتاج إلى بيئة Node.js لكتابة الدوال، وستحتاج إلى واجهة سطر الأوامر في Firebase لنشر الوظائف وقت تشغيل Cloud Functions. لتثبيت Node.js وnpm، مدير إصدارات العُقد الموصى به.

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

npm install -g firebase-tools

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

Python

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

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

إعداد مشروعك

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

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

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

    • JavaScript
    • TypeScript
    • Python

    في هذا الدليل التعليمي، اختَر JavaScript أو Python. للتأليف باللغة TypeScript، يُرجى الاطّلاع على كتابة الدوال باستخدام TypeScript.

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

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

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 لديك دوال الكتابة والنشر. يمكنك واختيار الإصدارات المتوافقة الأخرى.

Python

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

Python

# 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 منه. في أي مكان يتوفر دعم SDK للمشرف، كما هو بالنسبة إلى خدمة FCM والمصادقة وقاعدة بيانات Firebase في الوقت الفعلي، فإنها توفر وهي طريقة فعّالة لدمج Firebase باستخدام دوال السحابة.

واجهة سطر الأوامر في Firebase تلقائيًا تثبِّت وحدتَي حزمة تطوير البرامج (SDK) لمشرف Firebase وحزمة تطوير البرامج (SDK) لمنصة Firebase for 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.`});
});

Python

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

Python

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

محاكاة تنفيذ الدوال

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

لمحاكاة الدوال:

  1. شغِّل firebase emulators:start وتحقَّق من نتائج عنوان URL من واجهة مستخدم Emulator Suite. يتم ضبطه تلقائيًا على localhost:4000، ولكن قد تتم استضافته على موقع على جهازك. أدخِل عنوان URL هذا في المتصفّح لفتح واجهة مستخدم مجموعة المحاكي

  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:

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

      i functions: Beginning execution of "addMessage"

      i functions: Beginning execution of "makeUppercase"

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

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

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

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

  1. نفِّذ الأمر التالي لنشر الدوال:

     firebase deploy --only functions
     

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

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

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

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

  2. باستخدام ناتج عنوان URL بواسطة واجهة سطر الأوامر، أضف معلَمة طلب بحث نصي، وفتحه في المتصفح:

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

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

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

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

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

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

لمعرفة المزيد عن دوال السحابة، يمكنك أيضًا إجراء ما يلي: