hono-rate-limiterHonoのミドルウェアの制限レート。パスワードリセットなどのパブリックAPIおよび/またはエンドポイントへの繰り返しのリクエストを制限するために使用します。
注記
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複数のプロセスとサーバーにわたってヒットカウントを同期するために外部データストアをサポートしています。
デフォルトでは、 MemoryStoreが使用されます。これは、インスタンス全体でその状態を同期しません。展開するのは簡単で、基本的な虐待防止に十分な場合がありますが、再起動や複数のプロセスまたはサーバーを使用して展開中に一貫性がありません。
より一貫して強制された料金制限を必要とする展開は、外部ストアを使用する必要があります。
これが店舗のリストです:
| 名前 | 説明 |
|---|---|
| メモリストア | (デフォルト)単純なインメモリオプション。アプリに複数のプロセスまたはサーバーがある場合、状態を共有しません。 |
| @Hono-rate-limiter/redis | @vercel/kvおよび@upstash/redisで使用されるレディスバックストア。 |
| @Hono-rate-limiter/cloudflare | 耐久性のあるオブジェクト、WorkersKV、およびWorkersを使用して使用されるCloudFlare支援ストア。 |
| rate-limit-redis | 大規模または要求の厳しい展開により適したレディスバッキングストア。 |
| rate-limit-postgresql | PostgreSQLバックストア。 |
| レートリミットが混在しています | Memcached Backed Store。 |
| クラスターメモリストア | ノード:クラスターモジュールを介して、単一のサーバー上のすべてのプロセスにわたって状態を共有するメモリストアラッパー。複数のサーバーで状態を共有しません。 |
| PRECISEMEMORY-RATE-limit | 組み込みのメモリストアは、各キーに個別のタイムスタンプを保存することを除いて、組み込みのメモリストアです。 |
| Typeorm-rate-limit-store | MySQL、Mariadb、Cockroachdb、SQLite、Microsoft SQL Server、Oracle、SAP HANAなどのTypeormを介してさまざまなデータベースをサポートしています。 |
| @rlimit/ストレージ | 分散型RLIMITストア、複数地域の展開に最適です。 |
独自のストアを作成したい場合は、このガイドをご覧ください。
keyGenerator関数は、リクエストを制限するものを決定します。これは、制限を評価するユーザーまたはクラスのユニークな特性を表す必要があります。適切な選択には、 AuthorizationヘッダーのAPIキー、URLパスまたはルート、アプリケーションで使用される特定のクエリパラメーター、および/またはユーザーIDが含まれます。ここでの提案が機能しない場合は、GitHubディスカッションやHono Discordの#helpチャンネルに質問を投稿してみてください。
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を使用しようとしている場合は、次のエラーに遭遇する可能性があります。
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に互換性のあるストアを使用する必要があります。 CloudFlareのインフラストラクチャで動作するように特別に設計された@hono-rate-limiter/cloudflareパッケージを使用できます。
より多くの貢献者が関与したいと思います!
開始するには、寄稿ガイドをお読みください。
hono-rate-limiterプロジェクトは、Express-Rate-limitに深くインスピレーションを受けています