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

Express.js - الأساسيات

تعلم بناء تطبيقات ويب احترافية مع Express.js

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

ما هو Express.js؟

Express.js هو إطار عمل (Framework) سريع، مرن، وبسيط لبناء تطبيقات الويب والـ APIs باستخدام Node.js. يُعتبر Express.js الخيار الأول لمطوري Node.js بسبب سهولته وقوته.

لماذا Express.js؟

  • سهل التعلم والاستخدام
  • مرن ويسمح ببناء تطبيقات بأي حجم
  • يحتوي على نظام Middleware قوي
  • مجتمع ضخم ومكتبات كثيرة
  • أداء عالي وسريع

تثبيت Express.js

لتثبيت Express.js في مشروعك، استخدم الأمر التالي:

pnpm init -y pnpm add express

هذا الأمر سيقوم بـ:

  • إنشاء ملف package.json للمشروع
  • تثبيت Express.js وإضافته للمشروع

أول تطبيق Express

لنقم بإنشاء أول تطبيق بسيط باستخدام Express. أنشئ ملف app.js:

// استيراد Express const express = require('express'); // إنشاء تطبيق Express const app = express(); // تعريف المنفذ (Port) const PORT = 3000; // إنشاء Route أساسي app.get('/', (req, res) => { res.send('مرحباً بك في Express.js!'); }); // تشغيل السيرفر app.listen(PORT, () => { console.log(`السيرفر يعمل على المنفذ ${PORT}`); console.log(`زر http://localhost:${PORT}`); });

لتشغيل التطبيق:

node app.js

الآن افتح المتصفح وانتقل إلى http://localhost:3000 لترى رسالة الترحيب!

شرح الكود

require('express')

استيراد مكتبة Express لاستخدامها في التطبيق

express()

إنشاء تطبيق Express جديد وتخزينه في متغير app

app.get()

تعريف Route يستجيب لطلبات GET على المسار الرئيسي

app.listen()

بدء تشغيل السيرفر على المنفذ المحدد

كائنات Request و Response

في Express، كل Route يحصل على كائنين رئيسيين:

كائن Request (req)

يحتوي على معلومات الطلب الوارد من المتصفح:

  • req.params - معاملات URL
  • req.query - Query parameters
  • req.body - بيانات الجسم (Body)
  • req.headers - رؤوس الطلب

كائن Response (res)

يستخدم لإرسال الاستجابة للمتصفح:

  • res.send() - إرسال نص أو HTML
  • res.json() - إرسال JSON
  • res.status() - تعيين حالة HTTP
  • res.render() - عرض قالب

Routes متعددة

يمكنك إنشاء عدة Routes لمسارات مختلفة:

const express = require('express'); const app = express(); // الصفحة الرئيسية app.get('/', (req, res) => { res.send('مرحباً بك في الصفحة الرئيسية'); }); // صفحة عن التطبيق app.get('/about', (req, res) => { res.send('صفحة عن التطبيق'); }); // صفحة جهات الاتصال app.get('/contact', (req, res) => { res.send('تواصل معنا'); }); // API endpoint يرجع JSON app.get('/api/users', (req, res) => { res.json({ users: [ { id: 1, name: 'أحمد' }, { id: 2, name: 'فاطمة' }, { id: 3, name: 'محمد' } ] }); }); app.listen(3000, () => { console.log('السيرفر يعمل على المنفذ 3000'); });

Route Parameters

يمكنك إنشاء Routes ديناميكية تقبل معاملات:

// Route بمعامل ديناميكي app.get('/user/:id', (req, res) => { const userId = req.params.id; res.send(`صفحة المستخدم رقم: ${userId}`); }); // Route بعدة معاملات app.get('/posts/:year/:month', (req, res) => { const { year, month } = req.params; res.send(`مقالات ${month}/${year}`); }); // مثال عملي app.get('/product/:id', (req, res) => { const productId = req.params.id; // في التطبيق الحقيقي، ستبحث في قاعدة البيانات const product = { id: productId, name: 'منتج رقم ' + productId, price: 100 }; res.json(product); });

HTTP Methods الأساسية

Express يدعم جميع HTTP Methods:

// GET - لقراءة البيانات app.get('/api/items', (req, res) => { res.json({ message: 'جلب جميع العناصر' }); }); // POST - لإنشاء بيانات جديدة app.post('/api/items', (req, res) => { res.json({ message: 'تم إنشاء عنصر جديد' }); }); // PUT - لتحديث بيانات كاملة app.put('/api/items/:id', (req, res) => { res.json({ message: `تحديث العنصر ${req.params.id}` }); }); // PATCH - لتحديث جزء من البيانات app.patch('/api/items/:id', (req, res) => { res.json({ message: `تحديث جزئي للعنصر ${req.params.id}` }); }); // DELETE - لحذف البيانات app.delete('/api/items/:id', (req, res) => { res.json({ message: `حذف العنصر ${req.params.id}` }); });

تقديم ملفات ثابتة (Static Files)

لتقديم ملفات CSS، JavaScript، وصور:

const express = require('express'); const path = require('path'); const app = express(); // تحديد مجلد الملفات الثابتة app.use(express.static('public')); // أو مع مسار مخصص app.use('/assets', express.static('public')); // الآن يمكن الوصول للملفات: // http://localhost:3000/style.css // http://localhost:3000/script.js // http://localhost:3000/assets/image.png app.listen(3000);

ملاحظة مهمة

تأكد من إنشاء مجلد public وضع فيه ملفاتك الثابتة قبل استخدام express.static()

مثال عملي: API بسيط

لنبني API بسيط لإدارة قائمة مهام:

const express = require('express'); const app = express(); // Middleware لقراءة JSON app.use(express.json()); // قاعدة بيانات مؤقتة let todos = [ { id: 1, title: 'تعلم Node.js', completed: false }, { id: 2, title: 'تعلم Express', completed: false } ]; // جلب جميع المهام app.get('/api/todos', (req, res) => { res.json(todos); }); // جلب مهمة معينة app.get('/api/todos/:id', (req, res) => { const todo = todos.find(t => t.id === parseInt(req.params.id)); if (!todo) { return res.status(404).json({ error: 'المهمة غير موجودة' }); } res.json(todo); }); // إضافة مهمة جديدة app.post('/api/todos', (req, res) => { const newTodo = { id: todos.length + 1, title: req.body.title, completed: false }; todos.push(newTodo); res.status(201).json(newTodo); }); // تحديث مهمة app.put('/api/todos/:id', (req, res) => { const todo = todos.find(t => t.id === parseInt(req.params.id)); if (!todo) { return res.status(404).json({ error: 'المهمة غير موجودة' }); } todo.title = req.body.title; todo.completed = req.body.completed; res.json(todo); }); // حذف مهمة app.delete('/api/todos/:id', (req, res) => { const index = todos.findIndex(t => t.id === parseInt(req.params.id)); if (index === -1) { return res.status(404).json({ error: 'المهمة غير موجودة' }); } todos.splice(index, 1); res.status(204).send(); }); app.listen(3000, () => { console.log('API يعمل على المنفذ 3000'); });

يمكنك اختبار الـ API باستخدام أدوات مثل Postman أو Insomnia أو باستخدام curl:

# جلب جميع المهام curl http://localhost:3000/api/todos # إضافة مهمة جديدة curl -X POST http://localhost:3000/api/todos \ -H "Content-Type: application/json" \ -d '{"title": "مهمة جديدة"}' # تحديث مهمة curl -X PUT http://localhost:3000/api/todos/1 \ -H "Content-Type: application/json" \ -d '{"title": "مهمة محدثة", "completed": true}' # حذف مهمة curl -X DELETE http://localhost:3000/api/todos/1

الخطوات التالية

الآن وقد تعلمت أساسيات Express.js، إليك ما يجب أن تتعلمه بعد ذلك:

التوجيه المتقدم

تعلم Router المتقدم وتنظيم Routes

Middleware

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

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

بناء نظام قوي لمعالجة الأخطاء

قواعد البيانات

ربط Express مع MongoDB و PostgreSQL