پرش به مطلب اصلی

میان‌افزار محدودیت نرخ (RateLimit)

میان‌افزار محدودیت نرخ مسئول کنترل تعداد درخواست‌ها در بازه زمانی مشخص است.

هدف

این میان‌افزار از ارسال بیش از حد درخواست توسط کاربران یا IPها جلوگیری می‌کند.

نحوه کار

  1. بررسی تنظیمات rate limit در route
  2. استفاده از rate-limiter-flexible برای کنترل نرخ
  3. اعمال محدودیت بر اساس IP، fingerprint یا کاربر
  4. ارسال هدر Retry-After در صورت بلوک

تنظیمات Route

{
path: "/api/users",
methods: ["post"],
rateLimit: {
profile: {
points: 10, // تعداد درخواست مجاز
duration: 60 // بازه زمانی (ثانیه)
types: ["ip", "user"], // انواع محدودیت
},
errorMessage: "Too many requests",
errorStatusCode: 429
}
}

و یا میتوانید از دیکوریتور api.rateLimit استفاده کنید.

انواع محدودیت

IP Address

types: ["ip"];
// محدودیت بر اساس آدرس IP کلاینت

User ID

types: ["user"];
// محدودیت بر اساس ID کاربر احراز هویت شده

Fingerprint

types: ["fingerprint"];
// محدودیت بر اساس fingerprint دستگاه

ویژگی‌ها

  • انعطاف‌پذیری: تنظیمات سفارشی برای هر route
  • پشتیبانی چندگانه: محدودیت همزمان بر اساس چندین عامل
  • ذخیره‌سازی: استفاده از RateLimiterStore برای ذخیره وضعیت
  • هدر Retry-After: اطلاع زمان انتظار به کلاینت

خطاها

  • 429 Too Many Requests: تعداد درخواست‌ها بیش از حد مجاز
  • تنظیم هدر Retry-After با زمان انتظار

مثال استفاده

// محدودیت 100 درخواست در ساعت برای API عمومی
{
rateLimit: {
profile: { points: 100, duration: 3600, types: ["ip"] },

}
}

// محدودیت 5 درخواست در دقیقه برای کاربر
{
rateLimit: {
profile: { points: 5, duration: 60, types: ["user"] },

}
}

ملاحظات

  • نیاز به نصب rate-limiter-flexible
  • استفاده از ذخیره‌سازی داخلی برای نگهداری وضعیت
  • امکان تنظیم پیام خطا و کد وضعیت سفارشی