hono-rate-limiterRate einschränkende Middleware für Hono. Verwenden Sie, um wiederholte Anfragen an öffentliche APIs und/oder Endpunkte wie das Zurücksetzen des Kennworts zu beschränken.
Notiz
Die keyGenerator -Funktion muss definiert werden, damit hono-rate-limiter in Ihrer Umgebung ordnungsgemäß funktioniert. Bitte stellen Sie sicher, dass Sie die keyGenerator -Funktion entsprechend der Dokumentation definieren, bevor Sie die Bibliothek verwenden.
# 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 unterstützt externe Datenspeicher, um die Hit-Zählungen über mehrere Prozesse und Server hinweg zu synchronisieren.
Standardmäßig wird MemoryStore verwendet. Dieser synchronisiert seinen Zustand nicht über Fälle hinweg. Es ist einfach, bereitzustellen und oft ausreichend für die grundlegende Missbrauchsprävention, ist jedoch in Bezug auf Neustarts oder Bereitstellungen mit mehreren Prozessen oder Servern inkonsistent.
Bereitstellungen, die konsequent erzwungene Tarifgrenzen erfordern, sollten ein externes Geschäft verwenden.
Hier ist eine Liste von Geschäften:
| Name | Beschreibung |
|---|---|
| MemoryStore | (Standard) Einfache In-Memory-Option. Teilt keinen Zustand, wenn die App über mehrere Prozesse oder Server verfügt. |
| @Hono-Rate-Limiter/Redis | Ein Redis-Backed Store, der mit @vercel/kv und @upstash/redis verwendet wird. |
| @hono-rate-limiter/cloudflare | Ein Cloudflare-unterstütztes Geschäft, das mit dauerhaftem Objekt, Workerskv und Arbeitern einbezogen wird, beschränken die API. |
| Rate-Limit-Redis | Ein von Redis unterstütztes Geschäft, das besser für große oder anspruchsvolle Einsätze geeignet ist. |
| rate-limit-postgresql | Ein Postgresql-unterstützter Laden. |
| Rate-Limit-vorgefertigte | Ein von Memcached Backed Store. |
| Cluster-Memory-Store | Ein Speicher-Store-Wrapper, der Status über alle Prozesse auf einem einzelnen Server über das Knoten: Cluster-Modul übernimmt. Teilt den Zustand nicht über mehrere Server hinweg. |
| präzise Memory-Rate-Limit | Ein Speicherspeicher ähnelt dem eingebauten, außer dass er für jeden Schlüssel einen bestimmten Zeitstempel speichert. |
| TyporM-Rate-Limit-Store | Unterstützt eine Vielzahl von Datenbanken über Typorm: MySQL, Mariadb, Cockroachdb, SQLite, Microsoft SQL Server, Oracle, SAP Hana und mehr. |
| @rlimit/Speicher | Ein verteiltes RLIMit-Geschäft, ideal für multi-regionale Bereitstellungen. |
Schauen Sie sich diesen Leitfaden an, wenn Sie Ihr eigenes Geschäft erstellen möchten.
keyGenerator -Funktion bestimmt, was eine Anforderung einschränken soll. Sie sollte ein eindeutiges Merkmal eines Benutzers oder einer Klasse von Benutzern darstellen, die Sie bewerten möchten. Zu den guten Auswahlmöglichkeiten gehören API -Schlüssel in Authorization , URL -Pfaden oder Routen, spezifische Abfrageparameter, die von Ihrer Anwendung verwendet werden, und/oder Benutzer -IDs.Wenn die Vorschläge hier nicht funktionieren, versuchen Sie, Fragen zu Github -Diskussionen oder im #Help -Kanal von Hono Discord zu veröffentlichen.
Bei der Arbeit mit Paketen, die von hono-rate-limiter nicht offiziell unterstützt werden, können Sie möglicherweise auf Themen auftreten. Diese können leicht gelöst werden, indem Sie sich auf die Diskussionen in #22, #10 beziehen. Beispiel -
rateLimiter ( {
// ...
store : new RedisStore ( {
sendCommand : ( ... args : string [ ] ) => redisClient . sendCommand ( args ) ,
} ) as unknown as Store ,
} ) ;hono-rate-limiter mit Cloudflare-Mitarbeitern oder Seiten Wenn Sie versuchen hono-rate-limiter in einer CloudFlare-Umgebung (z. B. Arbeitnehmer oder Seiten) zu verwenden, können Sie auf den folgenden Fehler stoßen:
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/ Dies geschieht, da der von hono-rate-limiter verwendete Standardspeicher in der Cloudflare-Umgebung aufgrund seiner Einschränkungen für globale asynchrone Operationen nicht ausgeführt wird.
Um dieses Problem zu beheben, müssen Sie für CloudFlare einen kompatiblen Geschäft verwenden. Sie können das @hono-rate-limiter/cloudflare Paket verwenden, das speziell für die Arbeit mit der Infrastruktur von CloudFlare entwickelt wurde.
Wir würden gerne mehr Mitwirkende involviert haben!
Wenn Sie loslegen, lesen Sie bitte unseren beitragenden Leitfaden.
Das hono-rate-limiter Projekt ist stark von Express-Rate-Limit inspiriert