عمليات تكامل GraphQL و NodeJS باستخدام وظائف الرموز السحابية

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

ماذا لو كنت بحاجة إلى معلومات تجارية أكثر من ذلك في تطبيقك؟

ماذا لو كنت بحاجة إلى بعض المنطق إلى جانب ذلك؟

ماذا لو كنت تريد وحدة NPM Module Module الأنيقة معها؟

حسنًا، اربطوا أحزمة الأمان لأنني سأريكم اليوم شيئًا قويًا جدًا. ومع القوى العظيمة، تأتي قوة عظيمة… حسنًا… توفير وقت عظيم، وإمكانيات عظيمة، والكثير من الأشياء الجيدة.

إذا كنت تريد معرفة المزيد عن GraphQL ألق نظرة على هذا المنشور: ما هو GraphQL

يجب أن تكون بهذا الطول لركوب…

واستخدم Parse 3.5.0 أو أعلى للعب مع GraphQL.
انتقل إلى إعدادات الخادم وإدارة خادم Parse Server وتأكد من أنك تستخدم إصدارًا متوافقًا.

ميزتنا اللامعة الجديدة وظائف GraphQL + وظائف الرمز السحابي

إذا كنت من مستخدمي Parse / Back4app بالفعل، فربما تكون قد استخدمت أو على الأقل سمعت عن Cloud Code.

كود السحابة هو في الأساس كود NodeJS الذي يتم تشغيله من خوادم تطبيقات Back4app بدلاً من الأجهزة النهائية.

هذا يجلب بعض المزايا الرئيسية اعتمادًا على احتياجاتك، ولكنه يتيح لك بشكل أساسي

  • توفير بطاريات الهواتف المحمولة

    عندما تنقل عبء المعالجة الثقيل من الجهاز إلى السحابة، لن تتم المعالجة المكثفة على الجهاز، مما يوفر في البطارية. يمكنك إجراء المعالجة على خوادمنا واسترداد النتيجة النهائية فقط إلى العميل. لا مزيد من الهواتف المحمولة الساخنة في جيبك. لا مزيد من “يا إلهي هذا التطبيق يمتص بطاريتي حتى تنفد!”.

  • وفر في باقات البيانات

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

  • الحصول على نشر أسرع للكود

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

ولكن مرة أخرى… ماذا عن GraphQL؟

يتيح لك GraphQL إجراء استعلامات. يمكنك إجراء استعلامات ذكية للغاية، ولكن مجرد استعلامات.

عندما كان رئيسنا التنفيذي، دافي، يناقش كيفية جعلها أكثر ذكاءً، بدا التكامل مع وظائف كود السحابة مجرد منطق: لديك أفضل ما في العالمين! قوة وذكاء وظائف الرموز السحابية وذكائها، وسهولة وقابلية الصيانة التي توفرها GraphQL.

من خلال ميزتنا الجديدة يمكنك توسيع أنواع GraphQL لتنفيذ دوال التعليمات البرمجية السحابية واسترداد نتائجها.

يمكنك تطبيق أي منطق عمل يمكنك تخيله على دوال التعليمات البرمجية السحابية الخاصة بك، وتضمين وحدات NPM معها والاستعلام عنها جميعًا باستخدام GraphQL.

كفى حديثاً. دعنا نضع أيدينا عليها…

الفئات والكائنات التي سنستخدمها

بالنسبة لهذا المنشور، أنشأت فئتين متميزتين: الموظف والحيوانات الأليفة، والتي ستضم الموظفين هنا في Back4app وحيواناتهم الأليفة.

يمتلك الموظف الخصائص التالية:

  • الاسم (سلسلة)
  • العمر (رقم)
  • البريد الإلكتروني (سلسلة)
  • المنصب (سلسلة)
  • لديه هذا الحيوان الأليف (مؤشر إلى فئة الحيوان الأليف)

screen-shot-2019-08-07-at-13-18-26

يحتوي الحيوان الأليف على الخصائص التالية:

  • الاسم (سلسلة)
  • النوع (سلسلة)

screen-shot-2019-08-07-at-13-18-37

وبعض وظائف الشيفرة السحابية

وبالنسبة لوظائف الشيفرة السحابية، سأكتب ملفًا باسم main.js وأضمِّن الشيفرة التالية.

يحتوي على خمس دوال شيفرة سحابية مُعلَّق عليها بالكامل والتي ستعمل

  • التحقق من دعم GraphQL
    استرداد ما إذا كان التطبيق يدعم GraphQL
  • استرداد أول موظف بالاسم
    استرداد جميع تفاصيل الموظف الأول الموجود في قاعدة البيانات باسم معين
  • استرداد جميع الموظفين
    استرداد جميع التفاصيل حول جميع الموظفين
  • استردادOnrieveveOnwerOnwerOfPetByName
    استرداد تفاصيل الموظف الذي لديه حيوان أليف باسم معين
  • استرداد موظف بالاسم مع حيوان أليف
    استرداد جميع تفاصيل الموظف وحيوانه الأليف
Parse.Cloud.defined("checkGraphQLSupport"، async req => {
  /*
    تُرجع هذه الدالة ما إذا كان التطبيق يدعم GraphQL. 
    يكون parseGraphQLSServer صوابًا عندما يكون التطبيق مدعومًا، أو خطأ في غير ذلك
  */
  إذا (parseGraphQLServer){ {
    تُرجع "هذا التطبيق يدعم GraphQL.";
  غير ذلك {} {
    إرجاع "لا يحتوي هذا التطبيق على دعم GraphQL. إصدار خاطئ من Parse ربما؟
  }
});

Parse.Cloud.define("retrieveveFirstEmployeeByName"، async req => {
  /*
    تسترجع هذه الدالة أول موظف تم العثور عليه باسم معين.
    يتم استرداد جميع خصائص الموظف.
    يتم إرجاع موظف واحد فقط إذا كان هناك أكثر من موظف في قاعدة البيانات.
    إذا لم يكن هناك أي موظف، يتم استرجاع لا شيء.
  */
  const query = استعلام جديد Parse.Query("موظفين"); 
  الاستعلام.equTo("اسم"، req.params.name);
  النتيجة = في انتظار الاستعلام.first();
  إرجاع النتيجة;
});

Parse.Cloud.define("retrieveAllEmployees", async req => {
  /*
    تسترجع هذه الدالة جميع الموظفين.
    يتم استرداد جميع خصائص فئة الموظفين، ولكن تلك الفئة فقط.
    لا يتم استرجاع أي تفاصيل للمؤشرات أو العلاقات، فقط معرف الكائن.
    يتم إرجاع مصفوفة من الموظفين. فارغة في حال عدم وجود موظفين.
  */
  const query = استعلام جديد Parse.Query("موظفين"); 
  كونت النتائج = انتظر quaitery.find();
  إرجاع النتائج;
});

Parse.Cloud.defined("retrieveOnwerOnwerOfPetByName", async req => {
  /*
    تسترجع هذه الدالة المعلومات المتعلقة بالموظف المرتبط بحيوان أليف,
    باسم الحيوان الأليف.
    يتم استرجاع جميع خصائص فئة الموظف.
    لن يتم استرجاع أي تفاصيل عن الحيوان الأليف.
    يتم إرجاع مصفوفة من الحيوانات الأليفة. فارغة إذا لم يتم العثور على حيوان أليف.
  */

  // أولاً نقوم بعمل استعلام لاسترجاع المعلومات حول الحيوان الأليف
  const petQuery = جديد Parse.Query("حيوان أليف"); 
  petQuery.equTo("اسم"، req.params.name);
  
  // ثم نجري استعلامًا لاسترداد تفاصيل الحيوان الأليف استنادًا إلى خاصية hasThisPet
  دع الموظفQuery = استعلام Parse.Query("الموظفون") الجديد; 
  employeeQuery.matchesQuery("hasThisPet"، petQuery);
  const results = await employeeQuery.find();

  إرجاع النتائج;
  
});

Parse.Cloud.defined("retrieveEmployeeByNameWithPet"، async req => {
  /*
    تسترجع هذه الدالة المعلومات حول الموظف والحيوان الأليف المرتبط به,
    باسم الموظف.
    يتم استرجاع جميع خصائص فئة الموظف وفئة الحيوان الأليف.
    يتم إرجاع مصفوفة من الموظف، بما في ذلك خاصية hasThisPet المأهولة بالكامل
    مع المعلومات المتعلقة بالحيوان الأليف.
    يتم إرجاع مصفوفة ممتلئة إذا لم يتم العثور على موظف.
  */
  const query = استعلام جديد Parse.Query("الموظفون"); 
  الاستعلام.equTo("اسم"، req.params.name);
  تضمين الاستعلام("hasThisThisPet")
  تشكل النتائج = انتظر quaitery.find();
  إرجاع النتائج;
});

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

خطوة إضافية صغيرة

يمكن الآن استخدام الدوال البرمجية السحابية التي نشرناها للتو، ولكن لكي تعمل مع GraphQL، يجب علينا إنشاء ملف باسم schema.graphql وكشف تلك الدوال.

الصيغة بسيطة جدًا، ولكنها تحتاج إلى الانتباه:

تمديد نوع الاستعلام {
 GraphQLMethodName (اسم المعلمة: نوع المعلمة): ReturnType! @resolve(إلى:"CloudCodeFunctionName")
}

بالنسبة إلى الشيفرة أعلاه، يمثل بناء الجملة

  • GraphQLMethodName
    هذا هو الاسم الذي ستستدعيه في استعلام GraphQL الخاص بك. ليس من الضروري أن يتطابق مع اسم الدالة البرمجية السحابية، ولكن يجب أن تختار شيئًا يسهل فهم ما يفعله هذا الأسلوب.
  • اسم المعلمة
    اسم المعلمة التي ستستهلكها في الطلب عندما تكون داخل دالة الرمز السحابي. لستَ مضطرًا لتمرير هذا إذا لم تكن تستخدم معلمات في دالة التعليمة البرمجية السحابية.
  • نوع المعلمة
    نوع المعلمة التي تمررها. يمكنك معرفة المزيد عن المخططات والاطلاع على جميع الاحتمالات. لستَ مضطرًا لتمرير هذا إذا لم تكن تستخدم معلمات في دالة التعليمة البرمجية السحابية الخاصة بك.
  • نوع الإرجاع
    هذا هو نوع الإرجاع لطريقتك.
  • اسم الدالة البرمجية السحابية
    يجب أن يتطابق هذا مع اسم دالة التعليمة البرمجية السحابية الذي أعطيته في ملفك main.js، حيث ستستدعي تلك التعليمة البرمجية باسم الدالة.

إذًا، بالنسبة لملف main.js الذي أنشأناه للتو، سيكون schema.Graphql الخاص بنا

توسيع نوع الاستعلام {
  checkGraphQLSupport: سلسلة! @resolve(to: "checkGraphQLSupport")
  retrieveveThisEmployeeByName (الاسم: سلسلة): فئة الموظفين! @resolve(to: "retrieveveFirstEmployeeByName")
  أعطني جميع الموظفين: [فئة الموظفين!]! @resolve(to: "استرداد جميع الموظفين")
  أيهم هو الموظفون (الاسم: سلسلة): [فئة الموظفين!]! @resveolve(to: "retrieveOnwerOnwerOnwerOnwerOfPetByName")
  اجمع الموظف والحيوانات الأليفة حسب اسم الموظف (الاسم:سلسلة): [فئة الموظفين!]! @resveolve(to: "retrieveEmployeeByNameWithPet")
}

ليس بهذه الصعوبة، أليس كذلك؟

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

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

انشر كل شيء ونحن جاهزون للبدء:

screen-shot-2019-08-07-at-14-52-49

الآن، حان وقت السحر…

انتقل إلى وحدة تحكم GraphQL الخاصة بك. ابدأ في كتابة “استعلام” واستخدم وظيفة الإكمال التلقائي (CTRL + مفتاح المسافة على نظام ويندوز، OPTION + مفتاح المسافة على نظام ماك)، وشاهد السحر يحدث:

screen-shot-2019-08-07-at-15-11-36

جميع طرقنا موجودة ويمكننا الاستعلام عن كل واحدة منها. لنجربها واحدة تلو الأخرى:

  • تحقق من دعم الرسم البيانيGraphQL

    (يحل إلى دالة الرمز السحابي الخاصة بنا checkGraphQLSupport)
    screen-shot-2019-08-07-at-15-14-49

  • استرداد هذا الموظف بالاسم (الاسم: سلسلة)

    (يحلّ إلى دالة الرمز السحابي الخاصة بنا استرداد أول موظف بالاسم)
    screen-shot-2019-08-07-at-15-19-18

  • إعطائي جميع الموظفين

    (يحل إلى دالة الرمز السحابي الخاصة بنا استرداد جميع الموظفين)
    screen-shot-2019-08-07-at-15-21-06
    لاحظ في المثال أعلاه أنه تم استرجاع خاصيتي الاسم والعمر بشكل صحيح، لكن خاصية hasThisPet تحتوي على قيم فارغة لاسم ونوع الحيوان الأليف.
    هذا يرجع إلى حقيقة أننا لم نقم بتضمين (باستخدام أسلوب تضمين()) المعلومات المتعلقة بالحيوان الأليف في دالة الكود السحابي.
    سيُظهر لنا الإكمال التلقائي الاحتمالات، ولكن لم يتم توفير أي بيانات لاستيفاء تلك المعلومات في دالة الرمز السحابي.
    انظر المثال أدناه لمعرفة كيفية تضمين المعلومات في المثال أدناه: اُنظر المثال الخاص بـ collectEmployeeAndPetByByEmployeeNameresolves.

  • من هو صاحب العمل الذي هو صاحب هذا الحيوان الأليف

    (يُحل إلى دالة الرمز السحابي استردادوظيفة استردادOnwerOnwerOnwerPeetByName)
    screen-shot-2019-08-07-at-15-26-12

  • تجميعالموظف/الحيوان الأليفباحيباسم الموظف 

    (يحلّ إلى دالة الرمز السحابي الخاصة بنا استردادوظيفة استرداد الموظف بالاسم مع الحيوان الأليف)
    screen-shot-2019-08-07-at-15-28-54

تم تحديث تعريفاتك الرائعة

الآن، هذه هي الطريقة التي تجلب بها بعض منطق العمل إلى GraphQL.

أحبك 3000!

الخلاصة

GraphQL هي لغة استعلام ووقت تشغيل متعدد المنصات قوية وسهلة ومتعددة المنصات، ولكنها في نهاية المطاف لغة استعلام فقط.
مع هذا التكامل الجديد تمامًا مع وظائف الرمز السحابي، قدمنا لك أفضل ما في العالمين، وأطلقنا العنان لقوة الرمز السحابي (بما في ذلك وحدات NPM Modules، يا عزيزي!).

الآن الأمر متروك لك ولإبداعك! أخبرنا كيف يعجبك وكيف تستخدمه في مشاريعك في التعليقات أدناه!

ما هو Cloud Code؟

Cloud Code هو في الأساس Node JS. يعمل من خوادم Back4app بدلاً من الأجهزة الطرفية. يتميز بمزايا متنوعة تناسب احتياجاتك، فهو يوفر عليك استهلاك الطاقة، ويسرع نشر الكود، ويوفر البيانات حسب احتياجاتك.

كيف يساعد Cloud Code في توفير بطارية الهاتف المحمول؟

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

كيف يساعد Cloud Code في توفير البيانات؟

سيقوم كود السحابة باستعادة جميع البيانات التي كنت تستخدمها عبر الواي فاي أو بيانات هاتفك المحمول. سيستمر في استعادة البيانات وحساب تقارير كاملة على السحابة
سيقوم فقط باسترداد النتيجة الأخيرة للجهاز مما يؤدي إلى تقليل الحمولة وتقليل استخدام البيانات.


Leave a reply

Your email address will not be published.