مكتبة GraphQL لـ Node.js: Apollo Server وأدوات التطوير
GraphQL هي لغة استعلام لواجهات API تتيح للعملاء طلب البيانات التي يحتاجونها فقط. لتطوير تطبيقات Node.js، المكتبة الأكثر شيوعًا هي Apollo Server. توفر مجموعة كاملة من الأدوات لإنشاء واختبار ونشر واجهات GraphQL API. في هذه المقالة، سنشرح بالتفصيل المكونات الرئيسية والنهج وأمثلة الكود.
ما هو Apollo Server؟
Apollo Server هي مكتبة مفتوحة المصدر تتيح إنشاء خادم GraphQL بسرعة على Node.js. تدعم العديد من وسائل النقل (HTTP، WebSocket) وتتكامل بسهولة مع الأطر (Express، Koa، Fastify). الميزات الرئيسية:
- توليد تلقائي للتوثيق عبر GraphQL Playground.
- دعم الاشتراكات (subscriptions) عبر WebSocket.
- آلية التخزين المؤقت ودمج البيانات (data loaders).
- نظام middleware مرن للمصادقة والتفويض.
التثبيت والإعداد الأساسي
للبدء، قم بتثبيت الحزم apollo-server و graphql:
npm install apollo-server graphqlأنشئ خادمًا بسيطًا يعيد تحية:
const { ApolloServer, gql } = require('apollo-server');
// تعريف المخطط (SDL)const typeDefs = gql` type Query { hello: String }`;
// المحللات — دوال تعيد البياناتconst resolvers = { Query: { hello: () => 'Hello, GraphQL!', },};
// تشغيل الخادمconst server = new ApolloServer({ typeDefs, resolvers });server.listen().then(({ url }) => { console.log(`🚀 الخادم يعمل على ${url}`);});أنواع البيانات والمخططات
في GraphQL، يحدد المخطط جميع الأنواع والعمليات المتاحة. الأنواع الرئيسية:
String،Int،Float،Boolean،ID— أنواع عددية.[Type]— قائمة من الكائنات.type— كائن مخصص.input— نوع لمعاملات الإدخال للتحويرات (mutations).
مثال لمخطط مدونة:
type User { id: ID! name: String! posts: [Post!]!}
type Post { id: ID! title: String! content: String! author: User!}
type Query { user(id: ID!): User posts(limit: Int): [Post!]!}
type Mutation { createUser(name: String!): User!}المحللات: ربط المخطط بالبيانات
يجب أن يكون لكل حقل في المخطط محلل (resolver) مقابل. يمكن للمحللات جلب البيانات من قاعدة بيانات (MongoDB، PostgreSQL)، واجهات API خارجية، أو مصفوفات ثابتة.
const users = [ { id: '1', name: 'آنا' }, { id: '2', name: 'بوريس' },];
const posts = [ { id: '10', title: 'GraphQL للمبتدئين', content: '...', authorId: '1' }, { id: '20', title: 'نصائح Node.js', content: '...', authorId: '2' },];
const resolvers = { Query: { user: (_, { id }) => users.find(u => u.id === id), posts: (_, { limit }) => limit ? posts.slice(0, limit) : posts, }, Mutation: { createUser: (_, { name }) => { const newUser = { id: String(users.length + 1), name }; users.push(newUser); return newUser; }, }, User: { posts: (parent) => posts.filter(p => p.authorId === parent.id), },};نهج code-first مع TypeGraphQL
للمشاريع الكبيرة، من الأسهل استخدام نهج code-first حيث يتم توليد المخطط من فئات TypeScript. مكتبة type-graphql تتيح كتابة كود يكون في نفس الوقت نوعًا ومحللاً.
npm install type-graphql reflect-metadata class-validatorمثال لفئة كيان:
import { ObjectType, Field,