أساسيات GraphQL بنهج Code-First
أساسيات GraphQL بنهج Code-First
يدعم NestJS نهجَين لبناء واجهة GraphQL: schema-first (تكتب SDL وتولّد الأنواع) وcode-first (تكتب مُزخرفات TypeScript ويُولَّد المخطط تلقائيًا). يحتفظ نهج code-first بمصدر حقيقة واحد — كلاسات TypeScript — ويُزيل الصداع الناتج عن مزامنة ملفات SDL مع أنواع TypeScript. يغطّي هذا الدرس المكوّنات الأساسية: أنواع الكائنات، والحلّالات، والاستعلامات، والطفرات، وأنواع المدخلات.
التثبيت وإعداد الوحدة
سجّل GraphQLModule في AppModule الجذري باستخدام خيار autoSchemaFile الذي يُشير إلى المسار الذي يجب أن يكتب فيه NestJS ملف SDL المُولَّد (أو مرّر true للاحتفاظ به في الذاكرة فقط):
تعريف نوع كائن بـ @ObjectType و @Field
أي كلاس مُزخرَف بـ @ObjectType() يصبح نوع GraphQL. كل خاصية تريد كشفها في المخطط يجب أن تُعلَّم بـ @Field(). يتولّى استنتاج TypeScript المقياسات البدائية تلقائيًا، لكن يجب أن تكون صريحًا مع الحقول القابلة للقيمة الفارغة والمصفوفات:
@Field(() => Int) بدلًا من الاعتماد على الانعكاس مع الأرقام — إذ يُعيَّن number في TypeScript إلى كلٍّ من Int وFloat، لذا يجب أن تكون صريحًا لتجنّب الغموض.
إنشاء حلّال بـ @Query و @Mutation
الكلاس المُزخرَف بـ @Resolver() (أو @Resolver(() => Post) لتحديد النطاق) يكشف معالجات الاستعلامات والطفرات. تُعلن @Query() عملية قراءة؛ وتُعلن @Mutation() عملية كتابة. تُحقَن الوسيطات بـ @Args():
أنواع المدخلات بـ @InputType
تتلقّى الطفرات بيانات منظّمة عبر أنواع المدخلات. زخرف كلاسًا بـ @InputType() وحقوله بـ @Field() — يُولّد NestJS كتلة input في مخطط GraphQL. تتكامل أنواع المدخلات بسلاسة مع مُزخرفات class-validator:
ValidationPipe بشكل عام (أو على سياق GraphQL) حتى تُطبَّق مُزخرفات class-validator على كلاسات @InputType تلقائيًا قبل تشغيل الحلّال.
توليد المخطط التلقائي
بمجرد إعداد الوحدة، يعكس NestJS جميع الحلّالات وأنواع الكائنات/المدخلات المُسجَّلة عند البدء ويكتب ملف schema.gql. تشغيل التطبيق يُنتج شيئًا كالتالي:
الخلاصة
يحتفظ نهج code-first لـ GraphQL في NestJS بـ TypeScript كمصدر حقيقة وحيد. زخرف كلاسات النماذج بـ @ObjectType/@Field، واكتب كلاسات الحلّالات بـ @Query/@Mutation/@Args، وعرّف أشكال المدخلات بـ @InputType/@Field. يُولّد GraphQLModule.forRoot مع autoSchemaFile SDL ويُديره تلقائيًا، لذا لن تكتب أو تزامن ملفات مخطط GraphQL خام يدويًا.