Backend

Node.js للمبتدئين - بناء تطبيقات Backend احترافية

3 ديسمبر 2024 14 دقيقة قراءة فريق وليد سمارت
تعلم Node.js

ما هو Node.js؟

Node.js هو بيئة تشغيل JavaScript على الخادم (Server-side)، مبني على محرك V8 من Google Chrome. يتيح لك كتابة تطبيقات Backend بلغة JavaScript - نفس اللغة المستخدمة في Frontend! هذا يعني كود موحد من الأمام للخلف، مما يسهل التطوير ويزيد الإنتاجية.

الإحصائيات: أكثر من 50% من المطورين يستخدمون Node.js، وتعتمد عليه شركات عملاقة مثل Netflix, LinkedIn, Uber, وPayPal.

لماذا Node.js؟

1. سرعة فائقة

  • Non-blocking I/O: يتعامل مع آلاف الطلبات في نفس الوقت
  • Event-driven: أداء ممتاز للتطبيقات الحية (Real-time)
  • V8 Engine: محرك JavaScript الأسرع في العالم

2. نفس اللغة في كل مكان

  • JavaScript في Frontend و Backend
  • مشاركة الكود بين الطرفين
  • فريق واحد يطور الموقع كاملاً

3. NPM - أكبر مكتبة حزم

  • أكثر من 2 مليون حزمة جاهزة
  • حلول لكل مشكلة تقريباً
  • مجتمع نشط ومتعاون

4. مثالي للتطبيقات الحديثة

  • REST APIs
  • تطبيقات Chat
  • Streaming Services
  • IoT Applications

تثبيت Node.js

Windows:

  1. اذهب إلى nodejs.org
  2. حمّل النسخة LTS (Long Term Support)
  3. شغّل المثبت واتبع الخطوات
  4. تأكد من التثبيت:
node --version
npm --version

macOS/Linux:

# استخدام nvm (موصى به)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install --lts
nvm use --lts

أول برنامج Node.js

1. Hello World بسيط:

أنشئ ملف app.js:

console.log('مرحباً بك في Node.js!');
console.log('تاريخ اليوم:', new Date().toLocaleDateString('ar-EG'));

شغّل البرنامج:

node app.js

2. خادم HTTP بسيط:

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  res.end('<h1>مرحباً من Node.js!</h1>');
});

const PORT = 3000;
server.listen(PORT, () => {
  console.log(`الخادم يعمل على http://localhost:${PORT}`);
});

شغّل الخادم وافتح http://localhost:3000 في المتصفح!

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

Express هو إطار عمل بسيط وقوي لبناء تطبيقات الويب والـ APIs.

التثبيت:

# إنشاء مشروع جديد
mkdir my-express-app
cd my-express-app
npm init -y

# تثبيت Express
npm install express

مثال أساسي:

const express = require('express');
const app = express();
const PORT = 3000;

// Middleware لتحليل JSON
app.use(express.json());

// Route الرئيسية
app.get('/', (req, res) => {
  res.json({ 
    message: 'مرحباً بك في API الخاص بي!',
    timestamp: new Date()
  });
});

// Route للمستخدمين
app.get('/api/users', (req, res) => {
  const users = [
    { id: 1, name: 'أحمد', role: 'مطور' },
    { id: 2, name: 'فاطمة', role: 'مصممة' },
    { id: 3, name: 'محمد', role: 'مدير مشروع' }
  ];
  res.json(users);
});

// Route لمستخدم محدد
app.get('/api/users/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const user = { id, name: `مستخدم ${id}`, role: 'عضو' };
  res.json(user);
});

// Route لإنشاء مستخدم جديد
app.post('/api/users', (req, res) => {
  const newUser = req.body;
  res.status(201).json({
    message: 'تم إنشاء المستخدم بنجاح',
    user: newUser
  });
});

app.listen(PORT, () => {
  console.log(`الخادم يعمل على المنفذ ${PORT}`);
});

Middleware - القلب النابض

Middleware هي دوال تُنفذ بين الطلب والاستجابة:

أنواع Middleware:

// 1. Application-level middleware
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url} - ${new Date().toISOString()}`);
  next(); // مهم! لتمرير التحكم للتالي
});

// 2. Router-level middleware
const router = express.Router();
router.use((req, res, next) => {
  console.log('Router middleware');
  next();
});

// 3. Error-handling middleware
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'حدث خطأ!' });
});

// 4. Built-in middleware
app.use(express.json()); // لتحليل JSON
app.use(express.urlencoded({ extended: true })); // لتحليل form data
app.use(express.static('public')); // لخدمة الملفات الثابتة

// 5. Third-party middleware
const morgan = require('morgan');
app.use(morgan('dev')); // للـ logging

مثال: Authentication Middleware

// Middleware للتحقق من المصادقة
const authMiddleware = (req, res, next) => {
  const token = req.headers.authorization;
  
  if (!token) {
    return res.status(401).json({ error: 'غير مصرح' });
  }
  
  // التحقق من الـ token (مبسط)
  if (token === 'secret-token') {
    req.user = { id: 1, name: 'أحمد' };
    next();
  } else {
    res.status(403).json({ error: 'token غير صالح' });
  }
};

// استخدام الـ middleware
app.get('/api/protected', authMiddleware, (req, res) => {
  res.json({ 
    message: 'بيانات محمية',
    user: req.user 
  });
});

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

MongoDB مع Mongoose:

// التثبيت
npm install mongoose

// الاتصال بقاعدة البيانات
const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/myapp', {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
.then(() => console.log('تم الاتصال بـ MongoDB'))
.catch(err => console.error('خطأ في الاتصال:', err));

// تعريف Schema
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
  age: Number,
  createdAt: { type: Date, default: Date.now }
});

// إنشاء Model
const User = mongoose.model('User', userSchema);

// CRUD Operations
// إنشاء مستخدم
app.post('/api/users', async (req, res) => {
  try {
    const user = new User(req.body);
    await user.save();
    res.status(201).json(user);
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

// قراءة جميع المستخدمين
app.get('/api/users', async (req, res) => {
  try {
    const users = await User.find();
    res.json(users);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

// تحديث مستخدم
app.put('/api/users/:id', async (req, res) => {
  try {
    const user = await User.findByIdAndUpdate(
      req.params.id,
      req.body,
      { new: true }
    );
    res.json(user);
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

// حذف مستخدم
app.delete('/api/users/:id', async (req, res) => {
  try {
    await User.findByIdAndDelete(req.params.id);
    res.json({ message: 'تم الحذف بنجاح' });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

المصادقة والأمان

JWT (JSON Web Tokens):

npm install jsonwebtoken bcryptjs

const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');

const SECRET_KEY = 'your-secret-key';

// تسجيل مستخدم جديد
app.post('/api/register', async (req, res) => {
  try {
    const { email, password } = req.body;
    
    // تشفير كلمة المرور
    const hashedPassword = await bcrypt.hash(password, 10);
    
    const user = new User({
      email,
      password: hashedPassword
    });
    
    await user.save();
    
    // إنشاء Token
    const token = jwt.sign({ userId: user._id }, SECRET_KEY);
    
    res.status(201).json({ token });
  } catch (error) {
    res.status(400).json({ error: error.message });
  }
});

// تسجيل الدخول
app.post('/api/login', async (req, res) => {
  try {
    const { email, password } = req.body;
    
    const user = await User.findOne({ email });
    if (!user) {
      return res.status(401).json({ error: 'بيانات خاطئة' });
    }
    
    // التحقق من كلمة المرور
    const isValid = await bcrypt.compare(password, user.password);
    if (!isValid) {
      return res.status(401).json({ error: 'بيانات خاطئة' });
    }
    
    // إنشاء Token
    const token = jwt.sign({ userId: user._id }, SECRET_KEY);
    
    res.json({ token });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

// Middleware للتحقق من JWT
const verifyToken = (req, res, next) => {
  const token = req.headers.authorization?.split(' ')[1];
  
  if (!token) {
    return res.status(401).json({ error: 'غير مصرح' });
  }
  
  try {
    const decoded = jwt.verify(token, SECRET_KEY);
    req.userId = decoded.userId;
    next();
  } catch (error) {
    res.status(403).json({ error: 'token غير صالح' });
  }
};

أفضل الممارسات

تنظيم المشروع

project/
├── src/
│   ├── controllers/
│   ├── models/
│   ├── routes/
│   ├── middleware/
│   └── utils/
├── config/
├── tests/
└── server.js

الأمان

  • استخدم Helmet.js للحماية
  • CORS بشكل صحيح
  • Rate Limiting
  • لا تعرض معلومات حساسة في Errors

جودة الكود

  • استخدم ESLint و Prettier
  • اكتب Unit Tests
  • استخدم async/await بدلاً من Callbacks
  • معالجة الأخطاء بشكل صحيح

الأداء

  • استخدم Caching (Redis)
  • Gzip Compression
  • Database Indexing
  • راقب الأداء (PM2, New Relic)

مكتبات مفيدة

للتطوير:

  • nodemon: إعادة تشغيل تلقائي عند التعديل
  • dotenv: إدارة المتغيرات البيئية
  • morgan: HTTP request logger
  • cors: إدارة Cross-Origin requests

للأمان:

  • helmet: حماية HTTP headers
  • express-rate-limit: تحديد عدد الطلبات
  • express-validator: التحقق من البيانات

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

  • mongoose: لـ MongoDB
  • sequelize: لـ SQL databases
  • redis: للـ Caching

النشر (Deployment)

Heroku (مجاني):

# تثبيت Heroku CLI
npm install -g heroku

# تسجيل الدخول
heroku login

# إنشاء تطبيق
heroku create my-app-name

# النشر
git push heroku main

# فتح التطبيق
heroku open

Docker:

# Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

الخلاصة

Node.js فتح عالماً جديداً للمطورين - JavaScript في كل مكان! ابدأ بالأساسيات، ابنِ مشاريع بسيطة، ثم تدرج للمشاريع الأكثر تعقيداً. تذكر: الممارسة المستمرة هي السر، والمجتمع دائماً جاهز لمساعدتك. ابدأ اليوم، وبعد أسابيع ستبني APIs احترافية!

شارك هذا الدليل