العودة للرئيسية
الدرس التاسع

Middleware في Express

فهم واستخدام Middleware بشكل احترافي

45 دقيقة متوسط الفصل الثالث

ما هو Middleware؟

Middleware هي دوال تتنفذ بين استلام الطلب (Request) وإرسال الاستجابة (Response). تستخدم لإضافة وظائف معينة للتطبيق مثل التحقق من المصادقة، معالجة البيانات، والتسجيل (Logging).

استخدامات Middleware

  • تسجيل الطلبات (Request Logging)
  • التحقق من المصادقة والصلاحيات
  • معالجة البيانات (JSON, Form Data)
  • معالجة الأخطاء (Error Handling)
  • إضافة Headers للاستجابات

Middleware بسيط

const express = require('express'); const app = express(); // Middleware بسيط function logger(req, res, next) { console.log(`${req.method} ${req.url}`); next(); // مهم! انتقل للـ Middleware التالي } // استخدام Middleware app.use(logger); app.get('/', (req, res) => { res.send('مرحباً'); }); app.listen(3000);

ملاحظة مهمة

يجب استدعاء next() دائماً لتمرير التحكم إلى Middleware التالي، وإلا سيتوقف التطبيق!

Built-in Middleware

Express يحتوي على middleware جاهزة:

const express = require('express'); const app = express(); // لمعالجة JSON app.use(express.json()); // لمعالجة Form Data app.use(express.urlencoded({ extended: true })); // لتقديم ملفات ثابتة app.use(express.static('public')); app.post('/api/user', (req, res) => { console.log(req.body); // يعمل بفضل express.json() res.json({ success: true }); }); app.listen(3000);

Middleware للمصادقة

// Middleware للتحقق من المصادقة function requireAuth(req, res, next) { const token = req.headers.authorization; if (!token) { return res.status(401).json({ error: 'غير مصرح - token مفقود' }); } // التحقق من صحة Token (مبسط) if (token !== 'secret-token-123') { return res.status(403).json({ error: 'token غير صالح' }); } // إضافة بيانات المستخدم إلى req req.user = { id: 1, name: 'أحمد' }; next(); } // استخدام Middleware على routes معينة app.get('/api/profile', requireAuth, (req, res) => { res.json({ message: 'معلومات المستخدم', user: req.user }); }); // أو استخدامه على مجموعة routes app.use('/api/admin', requireAuth); app.get('/api/admin/dashboard', (req, res) => { res.json({ message: 'لوحة التحكم' }); });

معالجة الأخطاء

Error Handling Middleware له شكل خاص (4 معاملات):

// Error Handler Middleware (يجب أن يكون في النهاية) function errorHandler(err, req, res, next) { console.error('خطأ:', err.message); res.status(err.status || 500).json({ success: false, error: err.message || 'خطأ في السيرفر' }); } // Routes app.get('/api/error', (req, res, next) => { const err = new Error('حدث خطأ ما!'); err.status = 400; next(err); // تمرير الخطأ إلى Error Handler }); // يجب أن يكون Error Handler في النهاية app.use(errorHandler);

Third-Party Middleware

هناك middleware جاهزة ومفيدة من المجتمع:

// التثبيت pnpm add morgan cors helmet compression // الاستخدام const express = require('express'); const morgan = require('morgan'); // لتسجيل الطلبات const cors = require('cors'); // للسماح بـ Cross-Origin const helmet = require('helmet'); // للأمان const compression = require('compression'); // للضغط const app = express(); // Middleware للأمان app.use(helmet()); // تسجيل الطلبات app.use(morgan('combined')); // السماح بطلبات من نطاقات أخرى app.use(cors()); // ضغط الاستجابات app.use(compression()); app.get('/', (req, res) => { res.json({ message: 'Hello!' }); }); app.listen(3000);