← الدرس السابق المستوى 3 - الدرس 9 من 10

🖥️ Node.js - JavaScript في السيرفر: الدليل الشامل

تعلم كيف تبني تطبيقات Backend سريعة وقابلة للتوسع باستخدام Node.js وExpress.js

تقدمك في المستوى الثالث 90%

📋 محتويات الدرس

  1. ما هو Node.js ولماذا يُستخدم؟
  2. Node.js مقابل لغات Backend الأخرى
  3. تثبيت Node.js والتحقق منه
  4. أول تطبيق Node.js: خادم HTTP بسيط
  5. نظام الوحدات (Modules) في Node.js
  6. npm - مدير الحزم الأكبر في العالم
  7. Express.js - إطار العمل الأشهر
  8. Routing: التعامل مع المسارات
  9. Middleware - البرمجيات الوسيطة
  10. البرمجة غير المتزامنة في Node.js
  11. أمثلة واقعية: API بسيط، تسجيل دخول
  12. اختبر فهمك — اختبار تفاعلي

📖 ما هو Node.js ولماذا يُستخدم؟

Node.js هو بيئة تشغيل (Runtime Environment) تتيح تشغيل JavaScript خارج المتصفح — على السيرفر. طوره Ryan Dahl عام 2009 بناءً على محرك V8 الخاص بـ Google Chrome.

💡 لماذا Node.js ثوري؟

قبل Node.js، JavaScript كانت لغة متصفح فقط. لو أردت بناء Backend، اضطررت لتعلم PHP أو Python أو Java. اليوم، بـ JavaScript واحدة يمكنك بناء Full-Stack Application كاملة — Frontend وBackend وقاعدة بيانات.

مميزات Node.js الرئيسية

  • 🚀 أداء عالي: مبني على محرك V8 المُحسّن من Google
  • غير متزامن (Asynchronous): يتعامل مع آلاف الطلبات في نفس الوقت بدون توقف
  • 📦 npm: أكبر مستودع حزم في العالم (2+ مليون حزمة)
  • 🔄 JavaScript واحدة: نفس اللغة في Frontend وBackend
  • 💬 Real-time: مثالي للدردشة والألعاب المتعددة اللاعبين

⚖️ Node.js مقابل لغات Backend الأخرى

المعيار Node.js PHP Python Java
اللغة JavaScript PHP Python Java
النموذج غير متزامن متزامن متزامن/غير متزامن متزامن
السرعة ⚡ سريع جداً متوسط متوسط ⚡ سريع
الحزم 2+ مليون (npm) Packagist PyPI Maven
أفضل استخدام APIs, Real-time, I/O كثيف مواقع تقليدية AI, Data Science Enterprise, Banking
⚠️ متى لا تستخدم Node.js؟

Node.js ليس مثالياً للمهام الحسابية الثقيلة (CPU-intensive) مثل معالجة الصور أو الفيديو. في هذه الحالات، استخدم Python أو Go.

🔧 تثبيت Node.js والتحقق منه

يمكنك تثبيت Node.js من الموقع الرسمي nodejs.org. اختر النسخة LTS (Long Term Support) للاستقرار:

# التحقق من التثبيت - Node.js node -v # الناتج: v18.17.0 (أو أحدث) # التحقق من npm npm -v # الناتج: 9.6.7 (أو أحدث) # تشغيل ملف JavaScript node app.js # تشغيل REPL (Read-Eval-Print Loop) - جرب كود مباشرة node > 2 + 2 # 4 > console.log("Hello") # Hello

📝 أول تطبيق Node.js: خادم HTTP بسيط

باستخدام الوحدة المدمجة http، يمكنك إنشاء خادم ويب في 10 أسطر:

// app.js - خادم HTTP بسيط const http = require('http'); const server = http.createServer((req, res) => { // req = الطلب (Request) // res = الاستجابة (Response) res.statusCode = 200; // OK res.setHeader('Content-Type', 'text/html; charset=utf-8'); res.end(` <!DOCTYPE html> <html> <head><title>Node.js Server</title></head> <body> <h1>مرحباً من Node.js! 🚀</h1> <p>الوقت: ${new Date().toLocaleString('ar-EG')}</p> </body> </html> `); }); const PORT = 3000; server.listen(PORT, () => { console.log(`✅ الخادم يعمل على http://localhost:${PORT}`); });
✅ اختبر بنفسك:
  1. احفظ الكود في ملف app.js
  2. شغّل: node app.js
  3. افتح المتصفح على http://localhost:3000
  4. سترى صفحة HTML تُرسلها Node.js!

📦 نظام الوحدات (Modules) في Node.js

Node.js يستخدم نظام CommonJS للوحدات. كل ملف JavaScript يعتبر وحدة مستقلة:

// math.js - وحدة للعمليات الحسابية function add(a, b) { return a + b; } function multiply(a, b) { return a * b; } // تصدير الدوال module.exports = { add, multiply }; // ---------------------------------- // app.js - استيراد الوحدة const math = require('./math'); console.log(math.add(5, 3)); // 8 console.log(math.multiply(4, 7)); // 28 // أو بـ Destructuring const { add, multiply } = require('./math');

الوحدات المدمجة في Node.js

الوحدة الاستخدام مثال
httpإنشاء خوادم ويبrequire('http')
fsقراءة/كتابة الملفاتrequire('fs')
pathالتعامل مع مسارات الملفاتrequire('path')
osمعلومات نظام التشغيلrequire('os')
eventsإدارة الأحداثrequire('events')

📦 npm - مدير الحزم الأكبر في العالم

npm (Node Package Manager) هو أكبر مستودع برمجيات مفتوحة المصدر في العالم. يتيح لك تثبيت مكتبات جاهزة بأمر واحد:

# تهيئة مشروع جديد (ينشئ package.json) npm init -y # تثبيت حزمة للإنتاج (تُسجل في dependencies) npm install express # تثبيت حزمة للتطوير فقط (تُسجل في devDependencies) npm install nodemon --save-dev # تثبيت جميع الحزم المُسجلة في package.json npm install # تشغيل سكريبت مُعرّف في package.json npm start npm run dev npm test # إلغاء تثبيت حزمة npm uninstall express
💡 ملف package.json:

هذا الملف هو "جواز سفر" مشروعك. يحتوي على اسم المشروع، الإصدار، المؤلف، والحزم المُعتمدة. لا تحذفه أبداً! ولا تُرسل مجلد node_modules لـ Git — استخدم .gitignore.

🚀 Express.js - إطار العمل الأشهر

Express.js هو إطار عمل ويب minimalist لـ Node.js. يُبسّط إنشاء الخوادم وإدارة المسارات بشكل كبير:

// تثبيت Express أولاً: npm install express const express = require('express'); const app = express(); // Middleware لتحليل JSON app.use(express.json()); // Route أساسي app.get('/', (req, res) => { res.json({ message: 'مرحباً من Express!' }); }); // Route مع معاملات URL app.get('/users/:id', (req, res) => { const userId = req.params.id; res.json({ userId, message: `معلومات المستخدم ${userId}` }); }); // Route مع Query Parameters app.get('/search', (req, res) => { const query = req.query.q; res.json({ query, results: ["نتيجة 1", "نتيجة 2"] }); }); // تشغيل الخادم const PORT = 3000; app.listen(PORT, () => { console.log(`✅ Express يعمل على http://localhost:${PORT}`); });

🛣️ Routing: التعامل مع المسارات

Express يجعل إدارة المسارات سهلة ومنظمة:

// GET - جلب بيانات app.get('/api/products', (req, res) => { res.json(products); }); // POST - إنشاء بيانات جديدة app.post('/api/products', (req, res) => { const newProduct = req.body; products.push(newProduct); res.status(201).json(newProduct); }); // PUT - تحديث بيانات app.put('/api/products/:id', (req, res) => { const id = parseInt(req.params.id); const updated = req.body; // تحديث المنتج... res.json({ message: `تم تحديث المنتج ${id}` }); }); // DELETE - حذف بيانات app.delete('/api/products/:id', (req, res) => { const id = parseInt(req.params.id); // حذف المنتج... res.status(204).send(); });
الطريقة الوظيفة مثال
GETجلب بياناتعرض قائمة منتجات
POSTإنشاء بياناتإضافة منتج جديد
PUTتحديث كاملتعديل كل بيانات المنتج
DELETEحذف بياناتحذف منتج

🔧 Middleware - البرمجيات الوسيطة

Middleware هي دوال تُنفّذ بين استقبال الطلب وإرسال الاستجابة. تُستخدم للتحقق، التسجيل، ومعالجة البيانات:

// Middleware للتسجيل (Logging) app.use((req, res, next) => { console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`); next(); // انتقل للـ Middleware التالي }); // Middleware للتحقق من المصادقة function authMiddleware(req, res, next) { const token = req.headers['authorization']; if (!token) { return res.status(401).json({ error: 'غير مصرح' }); } // تحقق من التوكن... next(); } // استخدام Middleware على route محدد app.get('/admin', authMiddleware, (req, res) => { res.json({ message: 'لوحة التحكم' }); });

⚡ البرمجة غير المتزامنة في Node.js

سر Node.js الحقيقي يكمن في نموذجه غير المتزامن. بدلاً من انتظار كل عملية، يستمر في استقبال طلبات جديدة:

const fs = require('fs').promises; // ✅ Async/Await - الطريقة الحديثة والمستحسنة async function readFileAsync() { try { const data = await fs.readFile('data.txt', 'utf8'); console.log(data); return data; } catch (err) { console.error('خطأ:', err.message); } } // في Express route app.get('/data', async (req, res) => { const data = await readFileAsync(); res.json({ data }); });

💼 أمثلة واقعية من التطبيقات

1. API بسيط لقائمة مهام (To-Do API)

const express = require('express'); const app = express(); app.use(express.json()); let todos = [ { id: 1, text: "تعلم Node.js", done: false }, { id: 2, text: "بناء API", done: false } ]; // جلب جميع المهام app.get('/api/todos', (req, res) => { res.json(todos); }); // إضافة مهمة app.post('/api/todos', (req, res) => { const todo = { id: Date.now(), text: req.body.text, done: false }; todos.push(todo); res.status(201).json(todo); }); // تحديث حالة المهمة app.put('/api/todos/:id', (req, res) => { const todo = todos.find(t => t.id === parseInt(req.params.id)); if (todo) { todo.done = req.body.done; res.json(todo); } else { res.status(404).json({ error: 'غير موجود' }); } }); app.listen(3000);

2. تسجيل دخول بسيط

const users = [ { username: "admin", password: "123456" } // في الواقع: استخدم hashing! ]; app.post('/api/login', (req, res) => { const { username, password } = req.body; const user = users.find(u => u.username === username && u.password === password); if (user) { res.json({ success: true, message: "تم تسجيل الدخول!", token: "fake-jwt-token-123" }); } else { res.status(401).json({ success: false, message: "بيانات غير صحيحة" }); } });

🚀 الخطوة التالية: مشروع التخرج

في الدرس العاشر والأخير، ستبني مشروعاً كاملاً يجمع كل ما تعلمته:

  • 🌐 Frontend: HTML, CSS, JavaScript
  • ⚙️ Backend: Node.js + Express
  • 💾 Database: MongoDB أو JSON files
  • 🔐 Authentication: تسجيل دخول حقيقي
📚 مصادر إضافية:
← الدرس السابق: الأحداث