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

    بناء APIs قابلة للتوسع باستخدام Node.js و Express

    15 دقيقة قراءة
    422 41

    مقدمة

    بناء 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 قابل للتوسع يتطلب تخطيطاً جيداً واتباع أفضل الممارسات. ركز على:

    • هيكلة واضحة للمشروع
    • معالجة أخطاء شاملة
    • التحقق من المدخلات
    • التخزين المؤقت
    • المراقبة المستمرة