لماذا يحتاج مشروعك إلى بوابة API بلغة JavaScript؟
\n\nتخيل أن الخلفية (backend) الخاصة بك هي مركز تسوق ضخم. بداخله عشرات المتاجر (الخدمات المصغرة): واحد يبيع الكتب، وآخر الملابس، وثالث الإلكترونيات. كل متجر له مدخله الخاص، وقواعده الخاصة، ولغته الخاصة. والآن تخيل أن الزائر (تطبيق العميل) يجب أن يزور كل هذه المداخل لشراء قميص واحد. فوضى، أليس كذلك؟
\n\nفي عالم تطوير الويب، تحل بوابة API هذه المشكلة - وهي نقطة دخول موحدة لجميع الخدمات المصغرة. إنها مثل مدير مركز التسوق: توجه الطلبات، وتفحص التذاكر (الرموز المميزة)، وتجمع البيانات من المتاجر المختلفة، وتعطي العميل الرد الجاهز. واليوم سنشرح كيفية كتابة مثل هذه البوابة بلغة JavaScript الخالصة باستخدام Node.js.
\n\nستكون هذه المقالة مفيدة لكل من المبتدئين الذين يتعرفون فقط على بنية الخدمات المصغرة، والمطورين ذوي الخبرة الذين يريدون رؤية أمثلة كود عملية. هيا بنا!
\n\nما هي بوابة API ولماذا نحتاجها؟
\n\nبوابة API هي مكون خادم يعمل كطبقة وسيطة بين العميل والخدمات الداخلية. تتولى المهام التالية:
\n- \n
- التوجيه - توجيه الطلبات إلى الخدمة المصغرة المناسبة. \n
- المصادقة والتفويض - التحقق مما إذا كان المستخدم لديه صلاحية الوصول. \n
- تجميع البيانات - جمع الردود من عدة خدمات في رد واحد. \n
- تحديد عدد الطلبات - حماية الخلفية من الأحمال الزائدة. \n
- تحويل البروتوكولات - على سبيل المثال، تحويل REST إلى GraphQL. \n
بالنسبة لخدمات JavaScript (خاصة على Node.js)، فإن بوابة API هي الخيار الطبيعي. يمكن كتابتها بسهولة باستخدام Express أو Koa أو Fastify، والأهم من ذلك، أنها تسمح بالحفاظ على نمط كود موحد في جميع أنحاء المشروع.
\n\nتصميم هيكل بوابة API على Node.js
\n\nقبل كتابة الكود، دعنا نحدد البنية. لنفترض أن لدينا ثلاث خدمات مصغرة:
\n- \n
users-service- إدارة المستخدمين (المنفذ 3001). \n orders-service- الطلبات (المنفذ 3002). \n products-service- كتالوج المنتجات (المنفذ 3003). \n
العميل (الواجهة الأمامية) يتصل فقط بالبوابة على المنفذ 8080. البوابة هي التي تقرر أين ترسل الطلب.
\n\nالخطوة 1. الإعداد الأساسي لـ Express
\n\nلننشئ مشروعًا جديدًا ونثبت التبعيات:
\nmkdir api-gateway\ncd api-gateway\nnpm init -y\nnpm install express http-proxy-middleware dotenv\n\nالآن لنكتب بوابة بسيطة تقوم بتوكيل الطلبات إلى الخدمات:
\n// gateway.js\nconst express = require('express');\nconst { createProxyMiddleware } = require('http-proxy-middleware');\nrequire('dotenv').config();\n\nconst app = express();\nconst PORT = process.env.PORT || 8080;\n\n// مسارات الخدمات المصغرة\napp.use('/users', createProxyMiddleware({\n target: 'http://localhost:3001',\n changeOrigin: true,\n}));\n\napp.use('/orders', createProxyMiddleware({\n target: 'http://localhost:3002',\n changeOrigin: true,\n}));\n\napp.use('/products', createProxyMiddleware({\n target: 'http://localhost:3003',\n changeOrigin: true,\n}));\n\napp.listen(PORT, () => {\n console.log(`API Gateway تم تشغيله على المنفذ ${PORT}`);\n});\n\nوهذا كل شيء! الآن أي طلب إلى /users يتم إعادة توجيهه تلقائيًا إلى users-service. لكن هذه مجرد البداية. البوابة الحقيقية يجب أن تفعل المزيد.
إضافة المصادقة والتحقق من الرموز المميزة
\n\nإحدى المهام الرئيسية لبوابة API هي المصادقة المركزية. بدلاً من التحقق من JWT في كل خدمة مصغرة، نقوم بذلك مرة واحدة في البوابة.
\n\nلنضف middleware للتحقق من الرمز المميز:
\n// middleware/auth.js\nconst jwt = require('jsonwebtoken');\n\nconst authMiddleware = (req, res, next) =>