مكتبة GraphQL لجافا سكريبت (Node.js): graphql-http
GraphQL هي لغة استعلام لواجهات API، طورتها فيسبوك، والتي تتيح للعملاء طلب البيانات التي يحتاجونها فقط. في نظام Node.js، إحدى المكتبات الأساسية لتنفيذ خوادم GraphQL هي graphql-http. إنها أداة خفيفة الوزن لكنها قوية، تسمح بإنشاء واجهات API عالية الأداء بأقل تكاليف إضافية. على عكس الحلول الأكثر ثقلاً مثل Apollo Server، تقدم graphql-http مرونة وتحكمًا كاملاً في معالجات HTTP.
ما هي graphql-http؟
graphql-http هي مكتبة رسمية من مجتمع GraphQL، توفر طريقة بسيطة لربط GraphQL بأي خادم HTTP في Node.js. لا تعتمد على إطار عمل محدد (Express, Koa, Fastify، إلخ)، مما يجعلها خيارًا عالميًا. المهمة الرئيسية للمكتبة هي استقبال طلب HTTP الوارد، تحليله، تنفيذ استعلام GraphQL، وإرجاع رد منظم.
التثبيت والإعداد
للبدء، قم بتثبيت المكتبة عبر npm:
npm install graphql-http graphqlمثال بسيط لخادم على Node.js النقي (بدون Express):
const http = require('http');const { createHandler } = require('graphql-http');const { buildSchema } = require('graphql');
// تعريف المخططconst schema = buildSchema(` type Query { hello: String user(id: Int!): User } type User { id: Int name: String email: String }`);
// المحللاتconst rootValue = { hello: () => 'مرحبًا بالعالم!', user: ({ id }) => ({ id, name: `مستخدم ${id}`, email: `user${id}@example.com` })};
// إنشاء المعالجconst handler = createHandler({ schema, rootValue });
// خادم HTTPconst server = http.createServer((req, res) => { if (req.url === '/graphql') { handler(req, res); } else { res.writeHead(404); res.end('Not Found'); }});
server.listen(4000, () => { console.log('الخادم يعمل على http://localhost:4000/graphql');});التكامل مع Express
معظم المطورين يستخدمون Express. تكامل graphql-http مع Express سهل:
const express = require('express');const { createHandler } = require('graphql-http');const { buildSchema } = require('graphql');
const schema = buildSchema(` type Query { books: [Book] } type Book { title: String author: String }`);
const books = [ { title: 'الحرب والسلام', author: 'ليو تولستوي' }, { title: 'الجريمة والعقاب', author: 'فيودور دوستويفسكي' }];
const rootValue = { books: () => books};
const app = express();
app.all('/graphql', createHandler({ schema, rootValue }));
app.listen(3000, () => { console.log('Express + GraphQL على http://localhost:3000/graphql');});الميزات والفوائد الرئيسية
- مرونة التوجيه: أنت من يقرر نقطة النهاية التي سيكون فيها GraphQL متاحًا.
- دعم جميع طرق HTTP: يتم معالجة طلبات GET و POST بشكل صحيح.
- التحقق المدمج: تتحقق المكتبة تلقائيًا من توافق الطلبات مع المخطط.
- الأداء: استهلاك منخفض للذاكرة وسرعة معالجة عالية.
- قابلية التوسع: يمكن إضافة middleware للمصادقة، التسجيل، والتخزين المؤقت.
العمل مع الطفرات والاشتراكات
بالإضافة إلى الاستعلامات (Query)، تدعم graphql-http الطفرات (Mutation) لتعديل البيانات. مثال على مخطط مع طفرة:
const schema = buildSchema(` type Query { message: String } type Mutation { setMessage(newMessage: String!): String }`);
let message = 'قد