التطوير على الجهاز باستخدام 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 for Node.js
  • إنشاء دالة Cloud Function عبر بروتوكول HTTP واختبارها محليًا
  • تصحيح أخطاء دالة HTTP من جهازك المحلي
  • تفعيل دالة HTTP من جهازك المحلي

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

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

التكلفة

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

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

3- تثبيت Functions Framework for Node.js

Functions Framework for 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 for Node.js.

npm install @google-cloud/functions-framework

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

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

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

4. إنشاء دالة Cloud Function عبر بروتوكول HTTP واختبارها على الجهاز

إنشاء 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 API. اكتب 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 for Node.js
  • إنشاء دالة Cloud Function عبر بروتوكول HTTP واختبارها محليًا
  • تصحيح أخطاء دالة HTTP من جهازك المحلي
  • تفعيل دالة HTTP من جهازك المحلي