ما هو Schema؟
Schema هو "عقد" بين العميل والخادم — يُعرِّف شكل البيانات المتاحة والعمليات الممكنة.
يُكتب GraphQL Schema بلغة SDL (Schema Definition Language).
تعريف نوع (Type)
type User {
id: ID!
name: String!
email: String
posts: [Post!]!
}
!تعني حقل إلزامي (Non-nullable).[Post!]!مصفوفة لا يمكن أن تكونnull، وعناصرها لا يمكن أن تكونnull.
نوع الاستعلام (Query Type)
type Query {
users: [User!]!
user(id: ID!): User
}
ما هي Resolvers؟
Resolvers هي دوال (Functions) مسؤولة عن إرجاع البيانات لكل حقل في Schema. كل حقل في الـ Query أو Mutation له Resolver.
مثال: Resolver بسيط
const resolvers = {
Query: {
users: () => {
return db.findMany('users');
},
user: (parent, args, context, info) => {
return db.findOne('users', { id: args.id });
},
},
};
تمرير الـ Arguments
type Query {
searchUsers(query: String!, limit: Int = 10): [User!]!
}
searchUsers: (_, { query, limit }) => {
return db.search('users', { query, limit });
},
ربط الحقول بين الأنواع
type User {
id: ID!
name: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
author: User!
}
const resolvers = {
User: {
posts: (user) => {
return db.findMany('posts', { authorId: user.id });
},
},
Post: {
author: (post) => {
return db.findOne('users', { id: post.authorId });
},
},
};
⚠️ الانتباه لـ N+1 Problem: كل Resolver قد يُنفّذ استعلام قاعدة بيانات منفصل، مما يسبب بطئاً. الحل: use DataLoader أو تجميع الاستعلامات.
Context في Resolvers
Context هو كائن يُمرَّر لكل Resolver، ويُستخدم لمشاركة المصادقة، قاعدة البيانات، إلخ.
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => ({
user: getUserFromToken(req.headers.authorization),
db,
}),
});
// داخل Resolver
Query: {
me: (_, __, { user, db }) => {
if (!user) throw new Error('Unauthorized');
return db.findOne('users', { id: user.id });
},
},
أدوات مساعدة
- Apollo Server — أشهر خادم GraphQL لـ Node.js.
- GraphQL Yoga — بديل خفيف وسهل الإعداد.
- TypeGraphQL (NestJS) — كتابة Schema باستخدام classes و decorators.
خلاصة
- Schema يحدد شكل البيانات والعمليات.
- Resolvers تنفّذ المنطق الفعلي وتُرجِع البيانات.
- Context يمرّر المصادقة والخدمات المشتركة.
- الانتباه من مشكلة N+1 عند ربط الحقول.
🎯 التالي: GraphQL — Mutations و Subscriptions