التعامل مع كائن الطلبية (req) في إطار العمل Express.js
تُعد مكتبة Express.js واحدة من أشهر أُطر العمل في بيئة Node.js لبناء تطبيقات الويب وخدمات الواجهة الخلفية (Back-end). وتتميز Express بسهولة استخدامها ومرونتها العالية، مما جعلها الخيار الأول للمطورين لبناء تطبيقات خفيفة وسريعة الأداء. من أهم المكونات التي يعتمد عليها Express في التعامل مع الطلبات التي تصل إلى الخادم هو كائن الطلبية، أو ما يُعرف بـ Request Object والذي يُرمز له بـ req.
في هذا المقال سيتم التعمق في شرح كائن الطلبية req في إطار Express، وما يحويه من خصائص ودوال، وكيفية التعامل معه بطرق متقدمة، مع توضيح أهم الاستخدامات العملية في بناء التطبيقات الحديثة. كما سنتناول بعض التقنيات والتفاصيل الدقيقة التي تساعد المطورين على التعامل بكفاءة ومرونة مع الطلبات التي تصل إلى السيرفر، مما يعزز من قدراتهم في التحكم الكامل ببيانات العميل وطريقة معالجتها.
مقدمة عن كائن الطلبية (req)
عند استقبال خادم Express طلبًا من العميل (سواء كان متصفح أو تطبيق جوال أو خدمة أخرى)، يتم إنشاء كائن req يحتوي على كافة المعلومات الخاصة بالطلب الوارد. هذا الكائن يُعتبر نقطة الانطلاق لفهم محتوى الطلب، وتحديد الإجراءات المناسبة بناءً على هذه المعلومات.
يمثل كائن req طبقة تجريدية توفر مجموعة من الخصائص والطرق التي تمكن المطور من الوصول إلى معلومات متعددة، مثل: نوع الطلب، عنوان URL، المعاملات (query parameters)، بيانات الجسم (body)، الرؤوس (headers)، ملفات التعريف، ملفات التحميل، وغير ذلك.
الهيكلية العامة لكائن الطلبية req
في Express، كائن الطلبية هو امتداد لكائن الطلب الأصلي في Node.js (http.IncomingMessage)، ويضاف عليه العديد من الخصائص والطرق الخاصة بـ Express لتسهيل التعامل معه.
أهم الخصائص الأساسية في كائن req
-
req.method: يُشير إلى نوع الطلب HTTP مثل GET, POST, PUT, DELETE. -
req.url: عنوان URL الكامل للطلب. -
req.path: المسار فقط بدون استعلامات (query string). -
req.headers: كائن يحتوي على جميع رؤوس HTTP التي أرسلها العميل. -
req.query: كائن يحوي بيانات الاستعلام (Query Parameters) التي تأتي ضمن عنوان URL بعد علامة الاستفهام. -
req.params: كائن يحوي المعاملات التي تُستخلص من مسارات URL المعرفة ديناميكيًا في Express. -
req.body: يحتوي على بيانات جسم الطلب، والتي تكون عادة في طلبات POST أو PUT. -
req.cookies: كائن يحتوي على ملفات تعريف الارتباط التي أرسلها العميل. -
req.signedCookies: ملفات تعريف الارتباط الموقعة. -
req.ip: عنوان IP الخاص بالعميل. -
req.ips: قائمة بعناوين IP عندما يكون الخادم خلف بروكسي. -
req.get(headerName): دالة لاسترجاع قيمة رأس معين. -
req.protocol: بروتوكول الطلب (HTTP أو HTTPS). -
req.secure: قيمة منطقية تشير إذا كان الطلب عبر HTTPS.
التعامل مع بيانات الطلب
1. معالجة بيانات Query Parameters
تُستخدم بيانات الاستعلام في عنوان URL لتمرير معلومات غير محجوزة، وتكون على شكل أزواج مفتاح=قيمة. مثال:
httpGET /search?term=express&sort=asc
يمكن الوصول إلى هذه البيانات باستخدام req.query:
javascriptapp.get('/search', (req, res) => {
const term = req.query.term;
const sort = req.query.sort;
res.send(`بحث عن: ${term} مع ترتيب ${sort}`);
});
2. استخدام معلمات المسار (Route Parameters)
عندما يتم تعريف مسارات ديناميكية في Express، يمكن استخراج القيم من خلال req.params. مثال:
javascriptapp.get('/users/:userId/books/:bookId', (req, res) => {
const userId = req.params.userId;
const bookId = req.params.bookId;
res.send(`مستخدم: ${userId} ، كتاب: ${bookId}`);
});
تسمح هذه الطريقة ببناء واجهات برمجية مرنة تسمح بتحديد موارد مختلفة عبر نفس النمط العام للمسار.
3. قراءة بيانات الجسم (Request Body)
في الطلبات التي تحمل بيانات مثل POST و PUT، يتم إرسال بيانات الجسم التي قد تكون في تنسيقات مختلفة مثل JSON، form-data، أو raw. للوصول إلى هذه البيانات في Express، يجب استخدام Middleware مناسب لتحليلها، مثل express.json() أو express.urlencoded().
javascriptapp.use(express.json());
app.post('/users', (req, res) => {
const userData = req.body;
// معالجة بيانات المستخدم
res.send(`تم استقبال بيانات المستخدم: ${JSON.stringify(userData)}`);
});
التعامل مع رؤوس HTTP (Headers)
تعتبر الرؤوس في الطلبات جزءًا مهمًا لتوفير معلومات إضافية مثل نوع المحتوى، ترميز البيانات، المصادقة، والعديد من التفاصيل الأخرى. يمكن الوصول إلى الرؤوس باستخدام خاصية req.headers أو عبر الدالة req.get().
مثال:
javascriptapp.get('/check-header', (req, res) => {
const userAgent = req.get('User-Agent');
res.send(`نوع المتصفح: ${userAgent}`);
});
التعامل مع ملفات تعريف الارتباط (Cookies)
تعتمد العديد من التطبيقات على ملفات تعريف الارتباط لتتبع حالة الجلسات أو تخزين بيانات مؤقتة. يمكن استخدام مكتبة cookie-parser مع Express لتسهيل قراءة الكوكيز.
javascriptconst cookieParser = require('cookie-parser');
app.use(cookieParser());
app.get('/read-cookie', (req, res) => {
const myCookie = req.cookies.myCookieName;
res.send(`قيمة الكوكي: ${myCookie}`);
});
التعرف على IP العميل وطرق الأمان
توفر req.ip و req.ips معلومات عن عنوان IP الخاص بالعميل، وهذا مفيد في تسجيل الدخول، الأمان، وحجب العناوين المشبوهة.
javascriptapp.use((req, res, next) => {
console.log(`طلب من IP: ${req.ip}`);
next();
});
في حال كان التطبيق يعمل خلف بروكسي مثل Nginx، يجب تمكين الخيار trust proxy في Express لكي تكون القيم صحيحة.
طرق متقدمة في التعامل مع كائن الطلب
1. التعامل مع الملفات المرفقة (Multipart/form-data)
للتعامل مع رفع الملفات، يستخدم المطورون مكتبات خارجية مثل multer التي تدمج مع Express، مما يسمح بقراءة الملفات المرسلة عبر req.
javascriptconst multer = require('multer');
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('avatar'), (req, res) => {
console.log(req.file); // معلومات الملف
res.send('تم رفع الملف بنجاح');
});
2. قراءة بيانات البث (Streams)
بما أن req في Node.js هو كائن قابل للقراءة من نوع Stream، يمكن التعامل معه بطريقة متقدمة مثل قراءة البيانات بشكل تدريجي (chunk by chunk)، وهو أمر مهم عند التعامل مع البيانات الكبيرة أو تدفقات الفيديو والصوت.
استخدام Middleware لتوسيع قدرات req
في Express، يتم استخدام مفهوم الـ Middleware لتوسيع وظائف الطلب والاستجابة. يمكن تعديل أو إضافة خصائص جديدة إلى كائن req ليصبح أكثر تفاعلية.
مثال على Middleware لإضافة خاصية جديدة إلى req:
javascriptapp.use((req, res, next) => {
req.requestTime = Date.now();
next();
});
app.get('/', (req, res) => {
res.send(`وقت الطلب هو: ${req.requestTime}`);
});
مقارنة بين req في Express و Node.js الأصلي
كائن req في Node.js هو مجرد تدفق بيانات (Stream) يمثل طلب HTTP، لكنه يفتقر إلى العديد من الخصائص المفيدة التي توفرها Express مثل تحليل الجسم، التوجيه، استخراج المعاملات، وغيرها. يوفر Express طبقة إضافية من التجريد تسهل عمل المطور.
اعتبارات أمنية عند التعامل مع كائن الطلب req
-
التحقق من صحة البيانات: يجب دائمًا فحص والتحقق من صحة البيانات الواردة عبر
req.bodyوreq.queryوreq.paramsلتجنب هجمات حقن SQL، XSS، وغيرها. -
تحديد حجم البيانات: تجنب استقبال بيانات ضخمة قد تؤدي إلى استنزاف موارد الخادم، وذلك باستخدام Middleware مع إعدادات لحجم الجسم الأقصى.
-
التعامل مع ملفات التحميل: تأكد من فحص أنواع الملفات وحجمها عند التعامل مع رفع الملفات لمنع استغلال الثغرات.
-
حماية ملفات الكوكيز: استخدام ملفات تعريف الارتباط الآمنة والموقعة لتجنب التزوير.
جدول يوضح خصائص كائن الطلبية req في Express واستخداماتها
| الخاصية / الدالة | الوصف | الاستخدامات الشائعة |
|---|---|---|
req.method |
نوع الطلب HTTP | التحقق من نوع الطلب (GET, POST, PUT, DELETE) |
req.url |
عنوان URL الكامل للطلب | معالجة الطلبات بناءً على المسار الكامل |
req.path |
مسار الطلب بدون استعلام | تحديد المورد المطلوب |
req.headers |
رؤوس HTTP للطلب | قراءة بيانات المصادقة، النوع، الترميز، … |
req.query |
بيانات الاستعلام في URL | قراءة المعاملات من عنوان URL |
req.params |
معاملات المسار الديناميكية | استخراج قيم ديناميكية من المسارات |
req.body |
بيانات جسم الطلب | استقبال بيانات POST, PUT |
req.cookies |
ملفات تعريف الارتباط | قراءة الكوكيز |
req.signedCookies |
ملفات تعريف الارتباط الموقعة | قراءة ملفات تعريف الارتباط الموقعة |
req.ip |
عنوان IP الخاص بالعميل | تتبع الطلبات والتحكم بالأمان |
req.get(headerName) |
استرجاع قيمة رأس معين | قراءة رأس HTTP محدد |
req.protocol |
بروتوكول الطلب (HTTP/HTTPS) | التحقق من أمان الطلب |
req.secure |
قيمة منطقية تشير إلى HTTPS | تأكيد استخدام بروتوكول آمن |
الخاتمة
يمثل كائن الطلبية req في Express حجر الزاوية لفهم وإدارة البيانات التي تصل من العميل. يمتلك هذا الكائن بنية غنية تسمح باستخلاص معلومات متنوعة عن الطلب من عنوان URL، الرؤوس، جسم الطلب، ملفات تعريف الارتباط، وغيرها. التحكم الدقيق في هذا الكائن وتمكين المطور من قراءة وتعديل بيانات الطلب يمثل القدرة الحقيقية في بناء تطبيقات ويب مرنة وآمنة.
تتطلب المهارات المتقدمة في التعامل مع req معرفة كيفية استخدام Middleware لتحليل البيانات، التعامل مع الملفات، قراءة المعاملات المتعددة المصادر، وإضافة خصائص جديدة حسب الحاجة. إضافة إلى ذلك، فإن مراعاة اعتبارات الأمان عند معالجة طلبات المستخدم تظل أمرًا أساسيًا لمنع الثغرات وحماية البيانات.
باختصار، الكفاءة في التعامل مع كائن الطلب req هي من أهم المهارات التي يجب أن يتقنها مطور الـ Node.js لتطوير تطبيقات عالية الجودة تعتمد على Express.js.

