Node.js📅 2026-11-06⏱ 9 دقائق قراءة🟢 مقال 6 من 10

مقدمة في 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.queryQuery 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.css
  • public/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، أنت جاهز للمقال التالي:

  1. Express Routing — تنظيم المسارات.
  2. Middleware المتقدم — معالجة متقدمة.
  3. بناء REST API — واجهات احترافية.

الخلاصة

في هذا المقال، تعلمت:

  • ✅ ما هو Express ولماذا نحتاجه.
  • ✅ تثبيت Express.
  • ✅ المسارات (Routes).
  • ✅ req و res.
  • ✅ معاملات URL و Query Strings.
  • ✅ Middleware.
  • ✅ معالجة الأخطاء.
  • ✅ بناء API كامل.
  • ✅ حل 8 تمارين عملية.

تذكر: Express هو الإطار الأكثر استخداماً في Node.js. أتقنه جيداً.

📚 مقالات ذات صلة

Node.js

مشروع Node.js متكامل — API مع مصادقة JWT 2026

مشروع عملي شامل لبناء API متكامل بـ Node.js و Express و MongoDB — مع مصادقة JWT، رفع الملفات، والنشر

Node.js

MongoDB مع Node.js — دليل شامل 2026

دليل عملي مفصل لاستخدام MongoDB مع Node.js — Mongoose، Schema، CRUD، العلاقات، مع تمارين وحلول

Node.js

بناء REST API في Node.js — دليل شامل 2026

دليل عملي مفصل لبناء REST API احترافي — المبادئ، التنظيم، التحقق، والاختبار، مع تمارين وحلول