مقدمة
بناء API قوي وقابل للتوسع هو أساس أي تطبيق حديث. في هذا المقال، سنستكشف أفضل الممارسات لبناء APIs باستخدام Node.js و Express.
هيكلة المشروع
src/
├── controllers/ # منطق الأعمال
├── routes/ # تعريف المسارات
├── middleware/ # البرمجيات الوسيطة
├── models/ # نماذج قاعدة البيانات
├── services/ # خدمات خارجية
├── utils/ # أدوات مساعدة
└── app.js # نقطة الدخول
معالجة الأخطاء
class AppError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
this.isOperational = true;
}
}
const errorHandler = (err, req, res, next) => {
const statusCode = err.statusCode || 500;
res.status(statusCode).json({
success: false,
error: {
message: err.message,
code: err.code || 'INTERNAL_ERROR'
}
});
};
التحقق من البيانات
استخدم مكتبات مثل Zod أو Joi للتحقق:
const { z } = require('zod');
const userSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
name: z.string().min(2).max(100)
});
const validateUser = (req, res, next) => {
try {
userSchema.parse(req.body);
next();
} catch (error) {
res.status(400).json({ errors: error.errors });
}
};
التخزين المؤقت (Caching)
استخدم Redis للتخزين المؤقت:
const redis = require('redis');
const client = redis.createClient();
const cacheMiddleware = async (req, res, next) => {
const key = req.originalUrl;
const cached = await client.get(key);
if (cached) {
return res.json(JSON.parse(cached));
}
res.originalJson = res.json;
res.json = (data) => {
client.setEx(key, 3600, JSON.stringify(data));
res.originalJson(data);
};
next();
};
تحديد المعدل (Rate Limiting)
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 دقيقة
max: 100, // 100 طلب لكل IP
message: { error: 'طلبات كثيرة، حاول لاحقاً' }
});
app.use('/api/', limiter);
المراقبة والسجلات
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
الخلاصة
بناء API قابل للتوسع يتطلب تخطيطاً جيداً واتباع أفضل الممارسات. ركز على:
- هيكلة واضحة للمشروع
- معالجة أخطاء شاملة
- التحقق من المدخلات
- التخزين المؤقت
- المراقبة المستمرة