Node.js للمبتدئين - بناء تطبيقات Backend احترافية
ما هو 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:
- اذهب إلى nodejs.org
- حمّل النسخة LTS (Long Term Support)
- شغّل المثبت واتبع الخطوات
- تأكد من التثبيت:
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 احترافية!