GraphQL API مع TypeScript: دليل تعليمي خطوة بخطوة — الجزء 3

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة
```html

واجهة برمجة تطبيقات GraphQL مع TypeScript: دليل خطوة بخطوة — الجزء 3



في الأجزاء السابقة من الدليل، قمنا بتحليل أساسيات إنشاء خادم GraphQL باستخدام TypeScript وتعلمنا كيفية إعداد الاستعلامات البسيطة. في هذا الجزء الأخير، سنتعمق في التقنيات المتقدمة: الطفرات (Mutations)، الاشتراكات (Subscriptions)، ومعالجة الأخطاء. إذا كنت تدرس TypeScript للمبتدئين وترغب في إتقان برمجة واجهات برمجة التطبيقات الحديثة، فإن هذه المادة ستكون خطوة ممتازة إلى الأمام. تم بناء كل التعلم على أمثلة عملية يمكنك تطبيقها فوراً في مشاريعك.



1. تنفيذ الطفرات (Mutations) مع TypeScript



الطفرات هي عمليات تغيير البيانات (إنشاء، تحديث، حذف). في GraphQL يتم الإشارة إليها بالكلمة المفتاحية mutation. دعنا ننشئ طفرة لإضافة مستخدم جديد.



أولاً، نحدد النوع في مخطط GraphQL:



type Mutation {  addUser(name: String!, email: String!): User!}


الآن نقوم بتنفيذ المحلل (Resolver) باستخدام TypeScript. لاحظ التحديد الصارم للأنواع:



import { Resolver, Mutation, Arg } from 'type-graphql';import { User } from '../entities/User';

@Resolver()export class UserResolver { @Mutation(() => User) async addUser( @Arg('name') name: string, @Arg('email') email: string ): Promise<User> { const user = new User(); user.name = name; user.email = email; await user.save(); return user; }}


هام: في TypeScript نستخدم المُزينات (Decorators) @Mutation و @Arg من المكتبة type-graphql، مما يجعل الكود نظيفاً وآمناً من حيث الأنواع. هذا مفيد بشكل خاص لـ برمجة المشاريع الكبيرة حيث تكون القدرة على التوقع مهمة.



2. الاشتراكات (Subscriptions) للوقت الفعلي



تسمح الاشتراكات للعملاء بتلقي التحديثات في الوقت الفعلي عبر WebSocket. في TypeScript، يتطلب تنفيذها إعدادات إضافية للخادم.



دعنا نضيف اشتراكاً للرسائل الجديدة:



import { Subscription, Root } from 'type-graphql';

@Resolver()export class MessageResolver { @Subscription(() => Message, { topics: 'NEW_MESSAGE', }) newMessage(@Root() message: Message): Message { return message; }}


لنشر الحدث نستخدم pubSub.publish('NEW_MESSAGE', message). هذا يسمح بإنشاء دردشة أو إشعارات في الوقت الفعلي. الاشتراكات هي أداة قوية في ترسانة البرمجة، و TypeScript يجعل تنفيذها آمناً بفضل التحديد الثابت للأنواع.



3. معالجة الأخطاء والتحقق من الصحة



المعالجة الصحيحة للأخطاء هي مفتاح واجهة برمجة تطبيقات موثوقة. في TypeScript يمكننا استخدام فئات أخطاء مخصصة:



import { ApolloError } from 'apollo-server-express';

export class UserInputError extends ApolloError { constructor(message: string) { super(message, 'USER_INPUT_ERROR'); Object.defineProperty(this, 'name', { value: 'UserInputError' }); }}


في المحللين (Resolvers) نتحقق من بيانات الإدخال:



@Mutation(() => User)async createUser(@Arg('email') email: string) {  if (!email.includes('@')) {    throw new UserInputError('Invalid email format');  }  // ... منطق الإنشاء}


يمكننا أيضاً استخدام مُزينات التحقق من الصحة من class-validator:



import { IsEmail, Length } from 'class-validator';

class CreateUserInput { @Length(2, 50) name: string;

@IsEmail() email: string;}


أوصي بهذا النهج بشكل خاص لـ TypeScript للمبتدئين، لأنه يقوم بأتمتة التحقق من البيانات ويقلل من عدد الأخطاء البرمجية.



4. تحسين الأداء



بالنسبة لمشاريع الإنتاج، من المهم تجنب مشكلة N+1. استخدم DataLoader لـ

```

المدونات

توصيات الكتب