مقدمة في Express.js — دليل شامل 2026
دليل عملي مفصل لمقدمة Express.js — التثبيت، المسارات، الطلبات والاستجابات، مع تمارين وحلول
في المقال السابق، بنيت HTTP Server من الصفر. الآن سنتعلم Express.js — الإطار الذي يجعل بناء السيرفرات أسهل بكثير.
في هذا الدليل العملي، سنأخذك خطوة بخطوة لتعلم Express.js، مع تمارين وحلول.
ما هو Express.js؟
Express.js هو إطار عمل (Framework) مبني على Node.js، يبسّط بناء السيرفرات والتطبيقات.
تشبيه بسيط: إذا كان Node.js هو المحرك، فإن Express هو السيارة الكاملة — جاهزة للقيادة.
لماذا Express؟
قبل أن نبدأ، دعنا نتفق على الأسباب:
- بسيط: كود أقل بكثير من HTTP الخام.
- مرن: يمكن إضافة أي مكتبة.
- شائع: الأكثر استخداماً في Node.js.
- مميزات جاهزة: Routing، Middleware، Static Files.
- مجتمع ضخم: مصادر لا تنتهي.
الفرق بين HTTP الخام و Express
HTTP الخام:
const http = require("http");
http.createServer((req, res) => {
if (req.method === "GET" && req.url === "/") {
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
res.end("<h1>مرحباً</h1>");
} else if (req.method === "GET" && req.url === "/about") {
res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
res.end("<h1>من نحن</h1>");
} else {
res.writeHead(404);
res.end("404");
}
}).listen(3000);
مع Express:
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("<h1>مرحباً</h1>");
});
app.get("/about", (req, res) => {
res.send("<h1>من نحن</h1>");
});
app.listen(3000);
الفرق: Express أوضح و أقصر بكثير.
تثبيت Express
npm install express
أول تطبيق Express
index.js:
const express = require("express");
const app = express();
const PORT = 3000;
// المسار الرئيسي
app.get("/", (req, res) => {
res.send("مرحباً من Express! 🎉");
});
// تشغيل السيرفر
app.listen(PORT, () => {
console.log(`🚀 السيرفر يعمل على http://localhost:${PORT}`);
});
التشغيل:
node index.js
افتح المتصفح على http://localhost:3000 — سترى:
مرحباً من Express! 🎉
🎉 مبروك! بنيت أول تطبيق Express!
المسارات (Routes)
المسار = Method + Path + Handler.
app.METHOD(PATH, HANDLER);
1. GET
app.get("/", (req, res) => {
res.send("الصفحة الرئيسية");
});
2. POST
app.post("/users", (req, res) => {
res.send("تم إنشاء مستخدم");
});
3. PUT
app.put("/users/:id", (req, res) => {
res.send(`تم تحديث المستخدم ${req.params.id}`);
});
4. DELETE
app.delete("/users/:id", (req, res) => {
res.send(`تم حذف المستخدم ${req.params.id}`);
});
5. جميع الطرق
app.all("/secret", (req, res) => {
res.send("محمي");
});
جدول طرق HTTP
| الطريقة | الوظيفة | الاستخدام |
|---|---|---|
| GET | قراءة | جلب بيانات |
| POST | إنشاء | إضافة جديدة |
| PUT | تحديث كامل | استبدال |
| PATCH | تحديث جزئي | تعديل بعض الحقول |
| DELETE | حذف | إزالة |
req و res
req (Request)
| الخاصية | الوصف |
|---|---|
req.params | معاملات URL |
req.query | Query String |
req.body | بيانات POST |
req.method | طريقة HTTP |
req.url | الرابط |
req.headers | الرؤوس |
res (Response)
| الدالة | الوظيفة |
|---|---|
res.send() | إرسال نص/HTML |
res.json() | إرسال JSON |
res.status() | تعيين كود الحالة |
res.redirect() | إعادة توجيه |
res.sendFile() | إرسال ملف |
res.download() | تحميل ملف |
إرسال JSON
app.get("/api/users", (req, res) => {
res.json([
{ id: 1, name: "أحمد" },
{ id: 2, name: "محمد" },
]);
});
النتيجة: JSON تلقائياً مع Content-Type: application/json.
معاملات URL (Route Parameters)
app.get("/users/:id", (req, res) => {
const id = req.params.id;
res.send(`المستخدم رقم ${id}`);
});
النتيجة:
/users/1→ "المستخدم رقم 1"/users/42→ "المستخدم رقم 42"
عدة معاملات:
app.get("/users/:userId/posts/:postId", (req, res) => {
const { userId, postId } = req.params;
res.send(`المستخدم ${userId}، المقال ${postId}`);
});
Query Strings
app.get("/search", (req, res) => {
const { q, limit } = req.query;
res.json({ query: q, limit: limit || 10 });
});
الرابط: /search?q=react&limit=5
النتيجة:
{ "query": "react", "limit": "5" }
قراءة body (POST)
⚠️ مهم: Express لا يقرأ body تلقائياً. استخدم Middleware:
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
ثم:
app.post("/api/users", (req, res) => {
const { name, email } = req.body;
res.status(201).json({
success: true,
user: { name, email },
});
});
تقديم الملفات الثابتة
app.use(express.static("public"));
النتيجة: أي ملف في public/ يصبح متاحاً:
public/style.css→/style.csspublic/script.js→/script.js
Middleware
Middleware هي دوال تُنفَّذ قبل المسار.
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // ← مهم: للانتقال للمرحلة التالية
});
الأنواع:
| النوع | الوصف |
|---|---|
| Application-level | على كل التطبيق |
| Router-level | على Router معين |
| Error-handling | لمعالجة الأخطاء |
| Built-in | مدمج (express.json) |
| Third-party | خارجي (cors, morgan) |
مثال: Middleware للمصادقة
function auth(req, res, next) {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({ error: "غير مصرح" });
}
next();
}
app.get("/admin", auth, (req, res) => {
res.send("لوحة التحكم");
});
معالجة الأخطاء
404 Not Found
app.use((req, res) => {
res.status(404).json({ error: "المسار غير موجود" });
});
Error Handler
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: "خطأ في السيرفر" });
});
⚠️ مهم: Error Handler يجب أن يكون بعد كل المسارات، وله 4 معاملات.
مثال عملي: API للمهام
const express = require("express");
const app = express();
app.use(express.json());
let todos = [
{ id: 1, text: "تعلم Express", completed: false },
{ id: 2, text: "بناء API", completed: true },
];
// جلب كل المهام
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 { text } = req.body;
if (!text) return res.status(400).json({ error: "النص مطلوب" });
const newTodo = { id: Date.now(), text, 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.text = req.body.text || todo.text;
todo.completed = req.body.completed ?? todo.completed;
res.json(todo);
});
// حذف مهمة
app.delete("/api/todos/:id", (req, res) => {
const id = parseInt(req.params.id);
todos = todos.filter((t) => t.id !== id);
res.status(204).send();
});
// معالج 404
app.use((req, res) => {
res.status(404).json({ error: "المسار غير موجود" });
});
app.listen(3000, () => console.log("🚀 على http://localhost:3000"));
تمارين عملية
تمرين 1: سيرفر بسيط
أنشئ سيرفر Express يعيد "مرحباً".
الحل:
const express = require("express");
const app = express();
app.get("/", (req, res) => res.send("مرحباً"));
app.listen(3000);
تمرين 2: 3 مسارات
أنشئ 3 مسارات: /, /about, /contact.
الحل:
app.get("/", (req, res) => res.send("الرئيسية"));
app.get("/about", (req, res) => res.send("من نحن"));
app.get("/contact", (req, res) => res.send("اتصل بنا"));
تمرين 3: JSON
أعد مصفوفة مستخدمين كـ JSON.
الحل:
app.get("/api/users", (req, res) => {
res.json([
{ id: 1, name: "أحمد" },
{ id: 2, name: "محمد" },
]);
});
تمرين 4: معامل URL
أنشئ مسار /users/:id يعيد رقم المستخدم.
الحل:
app.get("/users/:id", (req, res) => {
res.send(`المستخدم: ${req.params.id}`);
});
تمرين 5: Query String
أنشئ مسار /search يقرأ q.
الحل:
app.get("/search", (req, res) => {
res.json({ query: req.query.q });
});
تمرين 6: POST
أنشئ POST يقبل JSON ويعيده.
الحل:
app.use(express.json());
app.post("/echo", (req, res) => {
res.json(req.body);
});
تمرين 7: Middleware
أضف Middleware يسجّل كل طلب.
الحل:
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`);
next();
});
تمرين 8: API كامل
ابنِ API كامل (CRUD) لـ "كتب".
الحل:
const express = require("express");
const app = express();
app.use(express.json());
let books = [];
let nextId = 1;
// جلب كل الكتب
app.get("/api/books", (req, res) => res.json(books));
// جلب كتاب
app.get("/api/books/:id", (req, res) => {
const book = books.find((b) => b.id === parseInt(req.params.id));
if (!book) return res.status(404).json({ error: "غير موجود" });
res.json(book);
});
// إضافة كتاب
app.post("/api/books", (req, res) => {
const book = { id: nextId++, ...req.body };
books.push(book);
res.status(201).json(book);
});
// تحديث كتاب
app.put("/api/books/:id", (req, res) => {
const book = books.find((b) => b.id === parseInt(req.params.id));
if (!book) return res.status(404).json({ error: "غير موجود" });
Object.assign(book, req.body);
res.json(book);
});
// حذف كتاب
app.delete("/api/books/:id", (req, res) => {
books = books.filter((b) => b.id !== parseInt(req.params.id));
res.status(204).send();
});
app.listen(3000);
حل المشاكل الشائعة
🔴 المشكلة 1: Cannot find module 'express'
الحل:
npm install express
🔴 المشكلة 2: req.body is undefined
الحل: أضف Middleware:
app.use(express.json());
🔴 المشكلة 3: EADDRINUSE
الحل: استخدم منفذاً آخر:
const PORT = process.env.PORT || 3001;
🔴 المشكلة 4: CORS Error
الحل:
npm install cors
const cors = require("cors");
app.use(cors());
🔴 المشكلة 5: 404 دائماً
السبب: app.use() لـ 404 قبل المسارات.
الحل: ضع معالج 404 بعد كل المسارات.
جدول دوال Express
| الدالة | الوظيفة |
|---|---|
app.get() | مسار GET |
app.post() | مسار POST |
app.put() | مسار PUT |
app.delete() | مسار DELETE |
app.use() | Middleware |
app.listen() | تشغيل السيرفر |
res.send() | إرسال نص |
res.json() | إرسال JSON |
res.status() | كود الحالة |
res.sendFile() | إرسال ملف |
قائمة تحقق نهائية
| المهمة | الحالة |
|---|---|
| تثبيت Express | ⬜ |
| إنشاء أول سيرفر Express | ⬜ |
| فهم المسارات (GET, POST, ...) | ⬜ |
| استخدام req.params و req.query | ⬜ |
| إرسال JSON | ⬜ |
| Middleware | ⬜ |
| حل التمارين الثمانية | ⬜ |
ماذا بعد هذا المقال؟
الآن بعد أن أتقنت أساسيات Express، أنت جاهز للمقال التالي:
- Express Routing — تنظيم المسارات.
- Middleware المتقدم — معالجة متقدمة.
- بناء REST API — واجهات احترافية.
الخلاصة
في هذا المقال، تعلمت:
- ✅ ما هو Express ولماذا نحتاجه.
- ✅ تثبيت Express.
- ✅ المسارات (Routes).
- ✅
reqوres. - ✅ معاملات URL و Query Strings.
- ✅ Middleware.
- ✅ معالجة الأخطاء.
- ✅ بناء API كامل.
- ✅ حل 8 تمارين عملية.
تذكر: Express هو الإطار الأكثر استخداماً في Node.js. أتقنه جيداً.
بناء HTTP Server في Node.js — دليل شامل 2026
التوجيه و Middleware في Express.js — دليل شامل 2026
📚 مقالات ذات صلة
مشروع Node.js متكامل — API مع مصادقة JWT 2026
مشروع عملي شامل لبناء API متكامل بـ Node.js و Express و MongoDB — مع مصادقة JWT، رفع الملفات، والنشر
MongoDB مع Node.js — دليل شامل 2026
دليل عملي مفصل لاستخدام MongoDB مع Node.js — Mongoose، Schema، CRUD، العلاقات، مع تمارين وحلول
بناء REST API في Node.js — دليل شامل 2026
دليل عملي مفصل لبناء REST API احترافي — المبادئ، التنظيم، التحقق، والاختبار، مع تمارين وحلول