الصورة من جانب سيباستيان أونرو على Unsplash

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

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

اطلع على دورة لغة GraphQL المجانية القادمة مع تدريبات المتصفح
من دورة لغة جرافيك القادمة

المقدمة

كما ناقشنا في هذه المقالة ، في مواصفات GraphQL لدينا أنواع مختلفة من القياس المدمج. ولكن ماذا يمكننا أن نفعل إذا كنا بحاجة إلى استخدام أدوات قياس غير محددة في مواصفات GraphQL؟ الجواب هو استخدام ما يسمى "العدد القياسي". كما في المقالات السابقة ، سوف نستخدم graphql-js. يمكن أن يختلف تطبيق العدد القياسي لـ GraphQL عبر تطبيقات GraphQL الأخرى. في بعض هذه التطبيقات ، قد لا يكون من الممكن حتى استخدام سجلات مخصصة.

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

git clone https://github.com/a7v8x/express-graphql-demo.git -b feature / 3-graphql-scalars

تعريف العددية المخصصة

الآن ، دعنا نذهب مباشرة إلى تصميم عددي DateTime. سنستخدم مكتبة js validator لاختبار ما إذا كانت القيمة بتنسيق سلسلة وقت تاريخ ISO8601. يمكن أن يكون التعريف المبسط للقيمة العددية DateTime كما يلي

في graphql-js ، يحتوي كل تعريف نوع قياسي مخصص على حقول وأساليب مختلفة يجب تحديدها. تمامًا كما هو الحال مع أنواع كائنات الإدخال / الإخراج ، يتعين علينا تحديد اسم الحقل المطلوب للعدد. حقل الوصف إلزامي مرة أخرى. إذا قرأت المقال حول المقاييس المضمنة ، فقد مررنا بالإدخال والإكراه على كل نوع. يتم تعريف هذا في مكتبة graphql-js للعدد القياسي. ومع ذلك ، عندما نحدد عددنا المخصص ، يجب علينا تحديد هذه القواعد. هذا هو السبب في أنه يتعين علينا تحديد طريقتين لكل عدد قياسي. هؤلاء هم:

  • تسلسل

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

  • parseValue ، parseLiteral

تشير الدالة parseValue و parseLiteral إلى إدخال الإدخال بالإكراه. الفرق هو أنه في parseValue ، نشير إلى المدخلات التي تم تمريرها باستخدام المتغيرات. عندما نستخدم parseValue ، تكون الوسيطة الأولى لهذه الوظيفة هي القيمة نفسها. من ناحية أخرى ، تحتوي الدالة parseLiteral على الوسيطة الأولى لقيمة ast بالتنسيق التالي

هذا هو السبب في أنه يتعين علينا استخراج القيمة من متغير ast والتحقق من صحتها مرة أخرى وفقًا لقواعدنا.

التنفيذ

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

الآن دعونا نتحقق مما إذا كانت قواعدنا ، التي حددناها تعمل كما هو متوقع. اذهب إلى / graphiql وحاول استدعاء استعلام getTasks الأساسي:

إذا تم تطبيق العدد الزمني المخصص للوقت المخصص لدينا بشكل صحيح ، فيجب أن تحصل على شيء مثل هذا:

الآن دعنا نختبر عمل تسلسلنا. اذهبوا إلى ملف taskDb.js وأعدوا تعيين createAt أو محدثًا إلى سلسلة ليست بتنسيق تاريخ ISO8601. سوف أقوم بتغيير حقل CreatAt إلى 2017–10–06 T14: 54: 54 + 0. الآن إذا حاولنا استدعاء استعلام getTasks ، سيرفع خادم GraphQL الخطأ التالي:

ملخص

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

  • JSON: استخدام JSON كعدد قياسي https://github.com/taion/graphql-type-json.
  • Date Time: هي مكتبة يمكنك استخدامها من أجل عدد أكبر من تاريخ التاريخ المحدد بدقة. في هذه المكتبة ، تتوفر أيضًا سجلات وقت وتاريخ منفصلة https://github.com/excitement-engineer/graphql-iso-date.
  • تاريخ الوقت والبريد الإلكتروني: هذه الحزمة عبارة عن مجموعة صغيرة من العدد القياسي المخصص https://github.com/adriano-di-giovanni/graphql-scalars.

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

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