hono-rate-limiterمعدل الحد من الوسيطة ل hono. استخدم للحد من الطلبات المتكررة على واجهات برمجة التطبيقات العامة و/أو نقاط النهاية مثل إعادة تعيين كلمة المرور.
ملحوظة
يجب تحديد وظيفة keyGenerator ليعمل hono-rate-limiter بشكل صحيح في بيئتك. يرجى التأكد من تحديد وظيفة keyGenerator وفقًا للوثائق قبل استخدام المكتبة.
# Using npm/yarn/pnpm/bun
npm add hono-rate-limiter import { rateLimiter } from "hono-rate-limiter" ;
// Apply the rate limiting middleware to all requests.
app . use (
rateLimiter ( {
windowMs : 15 * 60 * 1000 , // 15 minutes
limit : 100 , // Limit each IP to 100 requests per `window` (here, per 15 minutes).
standardHeaders : "draft-6" , // draft-6: `RateLimit-*` headers; draft-7: combined `RateLimit` header
keyGenerator : ( c ) => "<unique_key>" , // Method to generate custom identifiers for clients.
// store: ... , // Redis, MemoryStore, etc. See below.
} )
) ; import { webSocketLimiter } from "hono-rate-limiter" ;
import { upgradeWebSocket } from "hono/cloudflare-workers" ;
import { RedisStore } from "@hono-rate-limiter/redis" ;
import { Redis } from "@upstash/redis/cloudflare" ;
const limiter = webSocketLimiter ( {
windowMs : 15 * 60 * 1000 , // 15 minutes
limit : 100 , // Limit each IP to 100 requests per `window` (here, per 15 minutes).
keyGenerator : ( c ) => "<unique_key>" , // Method to generate custom identifiers for clients.
store : new RedisStore ( { client } ) , // Define your DataStore. See below.
} ) ;
// Apply the rate limiting middleware to ws requests.
app . get (
"/" ,
upgradeWebSocket (
limiter ( ( c ) => {
return {
onOpen : ( ) => {
console . log ( "Connection opened" ) ;
} ,
async onMessage ( event , ws ) {
console . log ( `Message from client: ${ event . data } ` ) ;
ws . send ( "Hello from server!" ) ;
} ,
onClose : ( ) => {
console . log ( "Connection closed" ) ;
} ,
} ;
} )
)
) ; يدعم hono-rate-limiter متاجر البيانات الخارجية لمزامنة تعدادات HIT عبر عمليات وخوادم متعددة.
بشكل افتراضي ، يتم استخدام MemoryStore . هذا واحد لا يزامن حالته عبر الحالات. من السهل النشر ، وغالبًا ما يكون كافياً للوقاية من الإساءة الأساسية ، ولكن سيكون غير متناسق عبر إعادة التمهيد أو في عمليات النشر مع عمليات أو خوادم متعددة.
يجب أن تستخدم عمليات النشر التي تتطلب حدود معدل فرضية بشكل أكبر متجرًا خارجيًا.
فيما يلي قائمة بالمتاجر:
| اسم | وصف |
|---|---|
| MemoryStore | (افتراضي) خيار بسيط في الذاكرة. لا يشارك الحالة عندما يكون للتطبيق عمليات أو خوادم متعددة. |
| @Hono-Rate-Limiter/Redis | متجر مدعوم بإعادة إعادةه ، يستخدم مع @vercel/kv و @upstash/redis . |
| @Hono-rate-Limiter/CloudFlare | متجر مدعوم من CloudFlare ، يستخدم مع كائن متين ، وعمال العمال و API الحد من معدل API. |
| معدل الحد الأقصى | متجر مدعوم من إعادة إدخاله ، أكثر ملاءمة للنشرات الكبيرة أو المتطلبة. |
| معدل الحد الأدنى بوستغرسكال | متجر PostgreSQL المدعوم. |
| معدل الحد الأقصى | متجر مدعوم من memcached. |
| مجموعة مجموعة الذاكرة | غلاف متجر الذاكرة الذي يشارك الحالة عبر جميع العمليات على خادم واحد عبر الوحدة النمطية: CLUSTER. لا يشارك الحالة عبر خوادم متعددة. |
| الدقة الدقيقة مع معدل | متجر للذاكرة مماثل لمخزن المدمج ، باستثناء أنه يخزن طابعًا زمنيًا مميزًا لكل مفتاح. |
| نوع المتجر مع معدل الحد | يدعم مجموعة متنوعة من قواعد البيانات عبر Typeorm: MySQL ، MariaDB ، CosiloCtDB ، SQLite ، Microsoft SQL Server ، Oracle ، SAP HANA ، وأكثر من ذلك. |
| @rlimit/التخزين | متجر Rlimit الموزع ، مثالي للنشر متعدد الإقليمية. |
ألقِ نظرة على هذا الدليل إذا كنت ترغب في إنشاء متجرك الخاص.
keyGenerator ما يجب الحد من الطلب عليه ، يجب أن تمثل خاصية فريدة للمستخدم أو فئة من المستخدم التي ترغب في تقييمها. تتضمن الخيارات الجيدة مفاتيح API في رؤوس Authorization ، ومسارات أو مسارات URL ، ومعلمات استعلام محددة يستخدمها التطبيق الخاص بك ، و/أو معرفات المستخدم.إذا لم تنجح الاقتراحات هنا ، فيرجى محاولة نشر أسئلة على مناقشات GitHub أو في قناة #HELP لـ Hono Discord.
عند العمل مع الحزم التي لا تدعمها رسميًا من قِبل hono-rate-limiter ، قد تواجه مشكلات متعلقة بالنوع. يمكن حلها بسهولة عن طريق الإشارة إلى المناقشات في #22 ، #10. مثال -
rateLimiter ( {
// ...
store : new RedisStore ( {
sendCommand : ( ... args : string [ ] ) => redisClient . sendCommand ( args ) ,
} ) as unknown as Store ,
} ) ;hono-rate-limiter مع عمال أو صفحات CloudFlare إذا كنت تحاول استخدام hono-rate-limiter في بيئة CloudFlare (مثل العمال أو الصفحات) ، فقد تواجه الخطأ التالي:
Uncaught Error: Disallowed operation called within global scope. Asynchronous I/O (ex: fetch () or connect ()), setting a timeout, and generating random values are not allowed within global scope. To fix this error, perform this operation within a handler. https://developers.cloudflare.com/workers/runtime-apis/handlers/ يحدث هذا لأن متجر الذاكرة الافتراضي الذي يستخدمه hono-rate-limiter لا يمكن تشغيله في بيئة CloudFlare بسبب قيوده على العمليات غير المتزامنة العالمية.
لحل هذه المشكلة ، تحتاج إلى استخدام متجر متوافق مع CloudFlare. يمكنك استخدام حزمة @hono-rate-limiter/cloudflare ، والتي تم تصميمها خصيصًا للعمل مع البنية التحتية لـ CloudFlare.
نود أن يشارك المزيد من المساهمين!
للبدء ، يرجى قراءة دليل المساهمة لدينا.
مشروع hono-rate-limiter مستوحى بشدة من الحد الأدنى المعدل