التطوير على الجهاز باستخدام Cloud Functions لـ Node.js باستخدام Visual Studio Code

1. نظرة عامة

‫Google Cloud Functions هي منصة حوسبة بدون خادم مستنِدة إلى الأحداث. تتيح لك Cloud Functions كتابة الرمز البرمجي بدون القلق بشأن توفير الموارد أو توسيع نطاقها للتعامل مع المتطلبات المتغيرة.

يتم تنفيذ دوال Cloud Functions المكتوبة بلغة JavaScript في بيئة Node.js على Google Cloud Platform. يمكنك تشغيل Cloud Function في أي وقت تشغيل عادي لـ Node.js لتفعيل إمكانية النقل والاختبار المحلي.

جولة إرشادية

في هذا الدرس التطبيقي حول الترميز، ستنشئ دالة Cloud Function لـ Node.js تحدّد ما إذا كانت درجة الحرارة المحدّدة مقبولة أو مرتفعة جدًا. ستنشئ دالة Cloud Function وتختبرها وتصحّح أخطاءها باستخدام Visual Studio Code على جهازك المحلي. أخيرًا، عليك نشر الدالة على Google Cloud Platform.

ما ستتعلمه

  • إطار عمل Functions Framework لـ Node.js
  • إنشاء دالة HTTP Cloud Function واختبارها محليًا
  • تصحيح أخطاء دالة HTTP من جهازك المحلي
  • تفعيل دالة HTTP من جهازك المحلي

2. الإعداد والمتطلبات

المتطلبات الأساسية

التكلفة

على الرغم من أنّ هذا الدرس التطبيقي حول الترميز يتطلّب استدعاءً واحدًا فقط لإحدى وظائف Cloud Functions التي تم نشرها، يجب الرجوع إلى معلومات أسعار Cloud Functions API لفهم طريقة عمل الفوترة.

على الرغم من إمكانية استخدام العديد من واجهات برمجة التطبيقات من Google بدون رسوم، إلا أنّ استخدام Google Cloud Platform (أي منتجاته وواجهات برمجة التطبيقات الخاصة به) ليس مجانيًا. يجب أن يكون لديك حساب فوترة نشط لاستخدام Cloud Functions. يُرجى العِلم أنّ بعض منتجات Google Cloud Platform (GCP) تتضمّن طبقة"دائمًا مجانية" يجب تجاوزها لتتم فوترتك. لأغراض هذا الدرس العملي، يتم احتساب كل استدعاء لـ Cloud Functions ضمن هذا المستوى المجاني. طالما أنّك تلتزم بالحدود الإجمالية (خلال كل شهر)، لن يتم تحصيل أي رسوم منك.

3- تثبيت Functions Framework لـ Node.js

إطار عمل Functions Framework لـ Node.js هو إطار عمل مفتوح المصدر لخدمة FaaS (الوظيفة كخدمة) يتيح كتابة وظائف Node.js قابلة للنقل، وهو من تطوير فريق Google Cloud Functions.

يتيح لك Functions Framework كتابة دوال بسيطة تعمل في العديد من البيئات المختلفة، بما في ذلك:

  • ‫Google Cloud Functions
  • جهاز التطوير المحلي
  • ‫Cloud Run وCloud Run على GKE
  • البيئات المستندة إلى Knative

أنشئ تطبيق Node.js جديدًا.

npm init

أثناء قبول الإعدادات التلقائية، احرص على استخدام index.js كنقطة دخول لتطبيقك.

الآن، ثبِّت Functions Framework لـ Node.js.

npm install @google-cloud/functions-framework

افتح ملف package.json. تأكَّد من ظهور إطار عمل الوظائف كاعتمادية كما هو موضّح في المثال أدناه.

"dependencies": {
   "@google-cloud/functions-framework": "^1.7.1"
 }

تم الآن تثبيت Functions Framework بنجاح. أنت الآن جاهز لإنشاء Cloud Function.

4. إنشاء دالة HTTP Cloud Function واختبارها محليًا

إنشاء Cloud Function محلية

في هذا القسم، ستنشئ دالة HTTP وتختبرها، وهي دالة تستجيب لطلبات HTTP.

أنشئ ملفًا جديدًا باسم index.js في الدليل نفسه الذي يحتوي على ملف package.json.

أضِف ما يلي:

exports.validateTemperature = async (req, res) => {
 try {
   if (req.body.temp < 100) {
     res.status(200).send("Temperature OK");
   } else {
     res.status(200).send("Too hot");
   }
 } catch (error) {
   //return an error
   console.log("got error: ", error);
   res.status(500).send(error);
 }
};

أنت الآن جاهز لاختبار الدالة.

اختبار الدالة في Visual Studio Code

من هذه النقطة فصاعدًا، سيستخدم هذا الدرس التطبيقي حول الترميز الوحدة الطرفية المدمجة في Visual Studio Code.

في Visual Studio Code، افتح نافذة المحطة الطرفية.

نفِّذ الأمر التالي:

node node_modules/@google-cloud/functions-framework --target=validateTemperature

يبدأ هذا الأمر خادمًا محليًا جاهزًا لاستدعاء الدالة validateTemperature عندما يتلقّى الخادم طلب HTTP.

من المفترض أن تظهر لك النتائج التالية في نافذة الوحدة الطرفية:

Serving function...
Function: validateTemperature
URL: http://localhost:8080/

أنشئ نافذة محطة طرفية ثانية في VS Code من خلال النقر على رمز علامة الجمع New Terminal في جزء نافذة "المحطة الطرفية". ستبدّل بين نافذتَي وحدة التحكّم هاتَين: الأولى لعرض الدالة والثانية لاستدعاء الدالة باستخدام curl.

bceb65f366d837ae.png

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

في نافذة الوحدة الطرفية الثانية، شغِّل الأمر التالي لإرسال حمولة درجة حرارة تبلغ 50 إلى الخادم المحلي الذي يعرض الدالة validateTemperature.

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"50"}'

من المفترض أن تتلقّى الردّ التالي من الدالة السحابية:

Temperature OK

في نافذة الوحدة الطرفية الثانية، اختبِر الدالة مرة أخرى عن طريق إرسال حمولة درجة حرارة "مرتفعة جدًا" كما هو موضّح أدناه:

curl -X POST http://localhost:8080 -H "Content-Type:application/json"  -d '{"temp":"120"}'

من المفترض أن تتلقّى الردّ التالي من الدالة السحابية:

Too hot

أخيرًا، اختبِر الدالة من خلال استدعائها بدون حمولة.

curl -X POST http://localhost:8080

من المفترض أن تتلقّى الردّ التالي من الدالة السحابية:

Too hot

من المفترض ألا تعرض الدالة "الجو حار جدًا" إذا لم يتم تقديم درجة الحرارة. لقد اكتشفت خطأً في الرمز.

احرص على إيقاف تشغيل الدالة من خلال الضغط على Ctrl + C في نافذة الوحدة الطرفية الأولى التي تعرض الدالة.

5- تصحيح أخطاء دالة HTTP من جهازك المحلي

افتح "لوحة الأوامر" في Visual Studio Code. إذا كنت تستخدم جهاز Mac، استخدِم Cmd + Shift + P. إذا كنت تستخدم جهاز Windows، استخدِم Ctrl + Shift + P.

اكتب auto attach في "لوحة الأوامر" (Command Palette) واختَر العنصر الأول في القائمة.

601e542b4ec9f6f9.png

في هذا الدرس العملي، اختَر Only With Flag كما هو موضّح في الصورة أدناه:

b9e6b762d150e62b.png

أعِد الآن تحميل نافذة الوحدة الطرفية التي استخدمتها في VS Code لعرض وظيفتك من خلال تمرير مؤشر الماوس فوق رمز التحذير الذي يظهر في أقصى اليسار.

انقر على Relaunch Terminal.

37b61e3fb546fc76.png

من نافذة الوحدة الطرفية التي تمّت إعادة تحميلها، أعِد تشغيل إطار عمل الدوال لعرض الدالة باستخدام الأمر التالي:

node --inspect node_modules/.bin/functions-framework --target=validateTemperature

حيث يشير العلامة --inspect إلى أنّ Node.js يجب أن يستمع إلى عميل تصحيح الأخطاء. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Node حول تصحيح الأخطاء.

يُرجى العِلم أنّك تستخدم node_modules/.bin/functions-framework بدلاً من node_modules/@google-cloud/functions-framework. يجب استخدام الملف التنفيذي المرتبط تلقائيًا في /node_modules/.bin لاستخدام وضع الفحص.

في هذه المرة، من المفترض أن يظهر شريط الحالة البرتقالي في VS Code يشير إلى أنّ أداة تصحيح الأخطاء مرتبطة.

اضبط نقطة توقّف عند السطر 3 من خلال النقر داخل الهامش على يمين رقم السطر.

2fbb4d5916e1dbfa.png

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

846e6c5993cc87f9.png

في نافذة الوحدة الطرفية الثانية، اضبط نقطة الإيقاف عن طريق تنفيذ أمر curl التالي.

curl -X POST http://localhost:8080 

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

206c7ed1eb189e90.png

مرِّر مؤشر الماوس فوق المتغيّر المؤقت للتأكّد من أنّ محتواه هو undefined، لأنّ الطلب لم يقدّم حمولة درجة الحرارة.

97979025f4bf2842.png

انقر على رمز "التنفيذ خطوة بخطوة" لتنفيذ العبارة التالية.

ستلاحظ أنّ العبارة الحالية تنتقل إلى جزء else من عبارة if.

cf0e8ce7e0388f98.png

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

انقر على الزر "قطع الاتصال" لقطع اتصال أداة تصحيح الأخطاء.

1070d059775ad769.png

في نافذة الوحدة الطرفية الأولى، أوقِف تشغيل الدالة من خلال الضغط على Ctrl + C.

عدِّل الدالة لإضافة عبارة if لطرح استثناء إذا كانت درجة الحرارة غير محدّدة كما هو موضّح أدناه:

exports.validateTemperature = async (req, res) => {

 try {

   // add this if statement below line #2
   if (!req.body.temp) {
     throw "Temperature is undefined";
   }

 ...

في نافذة الوحدة الطرفية الأولى، ابدأ تشغيل الدالة السحابية مرة أخرى عن طريق تنفيذ الأمر التالي بدون العلامة ‎–inspect لتجنُّب ربط أداة تصحيح الأخطاء.

node node_modules/@google-cloud/functions-framework --target=validateTemperature

تأكَّد من ظهور استثناء من خلال تنفيذ الأمر التالي في نافذة الوحدة الطرفية الثانية:

curl -X POST http://localhost:8080 

من المفترض أن تظهر لك النتائج التالية من طلبك:

Temperature is undefined

في نافذة الوحدة الطرفية الأولى، سيظهر لك أيضًا الخطأ الذي سجّلته الدالة.

Serving function...
Function: validateTemperature
URL: http://localhost:8080/
got error:  Temperature is undefined

يمكنك الآن إيقاف تشغيل الدالة بالضغط على Ctrl + C في نافذة الوحدة الطرفية الأولى.

6. نشر دالة HTTP من جهازك المحلي إلى Google Cloud

بعد إنشاء Cloud Function واختبارها وتصحيح أخطائها على جهازك المحلي، يمكنك نشرها على Google Cloud.

تأكَّد من أنّك تستخدم المشروع الذي أنشأته في الخطوة 2 محليًا من خلال تنفيذ الأمر التالي:

gcloud config get-value project

إذا لم يكن المشروع الذي حدّدته في الخطوة 2 هو الإعداد النشط، نفِّذ الأمر التالي:

gcloud config set project <project-name-created-step-2>

في أي نافذة وحدة طرفية، شغِّل الأمر التالي:

gcloud functions deploy validateTemperature --trigger-http --runtime nodejs12 --allow-unauthenticated

حيث يتم شرح المَعلمات على النحو التالي:

  • deploy validateTemperature: الأمر الفرعي gcloud لتوزيع Cloud Function بالاسم validateTemperature مع نقطة دخول باسم validateTemperature
  • --trigger-http: نوع الحدث الذي يؤدي إلى التفعيل
  • --runtime nodejs12: وقت التشغيل المستهدف لهذه الدالة
  • --allow-unauthenticated: يسمح بالوصول العلني إلى استدعاء الدالة

سيُطلب منك تفعيل واجهات برمجة التطبيقات Cloud Functions APIs. اكتب y لتفعيل واجهات برمجة التطبيقات.

API [cloudfunctions.googleapis.com] not enabled on project 
[1057316433766]. Would you like to enable and retry (this will take a 
few minutes)? (y/N)? y 

بعد اكتمال عملية النشر، سيظهر لك ما يلي في الناتج:

Deploying function (may take a while - up to 2 minutes)...done. 
availableMemoryMb: 256
buildId: <your-build-id>
entryPoint: validateTemperature
httpsTrigger:
  url: https://<your-region-and-project>.cloudfunctions.net/validateTemperature
...

في نافذة الوحدة الطرفية، استخدِم curl لاستدعاء نقطة النهاية العامة هذه.

curl -X POST https://<your-region-and-project>.cloudfunctions.net/validateTemperature -H "Content-Type:application/json"  -d '{"temp":"50"}'

وتأكَّد من أنّه تم نشر وظيفة السحابة الإلكترونية بنجاح من خلال التحقّق من الاستجابة المناسبة.

Temperature OK

7. تَنظيم

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

لحذف Cloud Function، انتقِل إلى Cloud Function Cloud Console على https://console.cloud.google.com/functions/ وتأكَّد من أنّ المشروع الذي أنشأته في الخطوة 2 هو المشروع المحدّد حاليًا.

اختَر الدالة validateTemperature التي نشرتها في الخطوة 6. بعد ذلك، انقر على "حذف".

4dada486485a935a.png

إذا اخترت حذف المشروع بأكمله، يمكنك الانتقال إلى https://console.cloud.google.com/cloud-resource-manager، واختيار المشروع الذي أنشأته في الخطوة 2، ثم النقر على "حذف". إذا حذفت المشروع، عليك تغيير المشاريع في Cloud SDK. يمكنك الاطّلاع على قائمة بجميع المشاريع المتاحة من خلال تنفيذ الأمر gcloud projects list.

8. تهانينا!

تهانينا على إكمال تجربة البرمجة. يمكنك الاطّلاع على مزيد من المعلومات حول كيفية توفير Cloud Functions لوقت تشغيل Node.js وكيفية عمل تصحيح الأخطاء على الجهاز المحلي باستخدام Cloud Functions.

المواضيع التي تناولناها

  • إطار عمل Functions Framework لـ Node.js
  • إنشاء دالة HTTP Cloud Function واختبارها محليًا
  • تصحيح أخطاء دالة HTTP من جهازك المحلي
  • تفعيل دالة HTTP من جهازك المحلي