الصورة من قبل بنيامين فوروس على Unsplash

كيفية تصميم واستعلامات GraphQL والطفرات: نوع التعداد

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

سوف نستمر في نفس المستودع. يمكنك استنساخ مستودع جيثب باستخدام هذا الأمر

git clone https://github.com/a7v8x/express-graphql-demo.git -b feature / 3-graphql-scalars
اطلع على دورة لغة GraphQL المجانية القادمة مع تدريبات المتصفح
من دورة لغة جرافيك القادمة

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

الرسم البياني الشجري الهرمي للاستجابة لاستفساراتنا والطفرات

أنواع التعداد

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

دعنا نعتبر أنه في نوع المهام الخاص بنا ، نقوم أيضًا بتعريف Enum لحالة المهمة. نحن نصمم هذا النوع من التعداد مع الأخذ في الاعتبار أن مهمة معينة يمكن أن تحتوي على واحدة من الحالات الثلاث:

  • تعيين؛
  • لم يتم تعيينهم.
  • في تقدم.

في لغة استعلام GraphQL ، يمكننا كتابتها في النموذج التالي

من الممارسات الشائعة الشائعة تسمية قيم التعداد كقيم كبيرة. في لغة GraphQL ، يتم تعيين هذه القيم تلقائيًا إلى اسم القيمة. ومع ذلك ، عندما نقوم بإعادة كتابة TaskStateEnum باستخدام graphql-js ، يمكننا أيضًا كتابة نوع التعداد في النموذج التالي:

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

الآن يمكننا تنفيذ حالتنا المحددة في تعريف المهمة لدينا:

جميع القيم الممكنة لحقل الحالة متاحة الآن من خلال التأمل في GraphiQL

جميع القيم الممكنة لـ TaskStateEnumType

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

نتيجة الإكراه على التعدادات

إذا تلقينا قيمة مختلفة من قاعدة البيانات ، والتي لم يتم تعريفها في نوع التعداد ، فسيظهر خطأ. على سبيل المثال ، دعنا نغير قيمة حالة مهمة النموذج في ملف "in-memory" db (ملف taskDb.js) إلى الحالة السيئة. ثم قم بتنفيذ الاستعلام التالي لاسترداد المهام من الخادم

سيرفع خادم GraphQL الخطأ التالي:

توقع قيمة النوع \ "TaskStateEnumType \" لكن تم استلامها: badstate

الشيء المهم الذي يجب التعرف عليه هو حقيقة أننا إذا قمنا بتغيير الحالة من القيمة الصحيحة 1 (غير المعينة) إلى قيمة السلسلة "غير المعينة" فإن GraphQL سترفع أيضًا نفس نوع الخطأ:

توقع قيمة النوع \ "TaskStateEnumType \" لكن تم استلامها: غير معين

يهتم خادم GraphQL بتعيين القيمة الداخلية عند التعامل مع إجبار النتائج ، وبالتالي سيرفع الخطأ عندما لا تتطابق قيم التعداد الداخلية مع البيانات المستلمة. إذا تمت مطابقة البيانات بقيم تعدادية ، فسيتم بعد ذلك تعيين قيم البيانات وفقًا لمواصفات التعداد ، على سبيل المثال سيتم تعيين 2 إلى IN_PROGRESS. ومع ذلك ، عندما نستخدم float 1.0 كقيمة لحقل حالة المهمة في ديسيبل "في الذاكرة". ثم يتم تحويل القيمة إلى عدد صحيح 1 ولا يرفع GraphQL خطأ حيث تتوفر البيانات في مواصفات TaskStateEnum.

إكراه الإدخال للتعدادات

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

سيرفع خادم GraphQL الخطأ التالي.

تحتوي الوسيطة \ "input \" على قيمة غير صالحة {name: \ "مهمة ذات حالة سيئة \" ، الحالة: badState}. \ n في الحقل \ "state \": النوع المتوقع \ "TaskStateEnumType \" ، تم العثور على badState.

الخطأ offen في graphiql هو تنفيذ طفرة addTask هذه

لا يمكن التنبؤ به دائمًا أنه سيرفع الخطأ التالي

تحتوي الوسيطة \ "الإدخال \" على قيمة غير صالحة {name: \ "المهمة التالية \" ، الحالة: \ "المعينة \"}. \ n في الحقل \ "الحالة \": النوع المتوقع \ "TaskStateEnumType \" ، وجدت \ "تم تعيين \ ".

الطريقة الصحيحة لتمرير التعدادات المتضمنة في وسيطات GraphiQL هي فقط لتحديد القيم المذكورة دون الاقتباس

هذا مختلف ، بالطبع ، عندما نحدد الطفرات باستخدام المتغيرات ، حيث يجب كتابة المتغير وفقًا لمواصفات بناء جملة JSON. في هذه الحالة ، يتعين علينا استخدام السلاسل. يمكنك التحقق من مواصفات GraphQL لمزيد من المعلومات حول هذا الموضوع.

هل أعجبك هذا المنشور؟ ثم التصفيق لهذا المقال لأنه من السهل على الآخرين العثور عليه. يمكن استنساخ المستودع الذي يحتوي على أمثلة وإعداد المشروع من فرع جيثب. يمكنك الوصول مبكرًا إلى دورة GraphQL المجانية القادمة من خلال الاشتراك في graphqlmastery.com.