ما هو 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);