hono rate limiter
v0.4.0
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 | 一家由Cloudflare支持的商店,與耐用的對象,WorkersKV和工人一起使用限制API。 |
| 費率限制 | 重新支持的商店,更適合大型或苛刻的部署。 |
| 速率限制的postgresql | 一家後QL支持的商店。 |
| 速率限制的限制 | 一家由備受支持的商店。 |
| 集群內存商店 | 一種內存儲物包裝器,通過節點:cluster模塊在單個服務器上共享所有進程的狀態。不會在多個服務器上共享狀態。 |
| 精確的內存率限制 | 一個類似於內置的存儲器存儲器,除了它為每個鍵存儲一個獨特的時間戳。 |
| typeorm-rate-limit商店 | 通過TypeORM來支持各種數據庫:MySQL,Mariadb,CockroactDB,Sqlite,Microsoft SQL Server,Oracle,SAP HANA等。 |
| @rlimit/storage | 分佈式RLIMIT商店,非常適合多區域部署。 |
如果您想創建自己的商店,請查看本指南。
keyGenerator函數確定要限制請求的內容,它應代表您希望限制的用戶或一系列用戶的唯一特徵。不錯的選擇包括Authorization標題,URL路徑或路由中的API鍵,應用程序使用的特定查詢參數和/或用戶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工人或頁面一起使用如果您試圖在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。您可以使用@hono-rate-limiter/cloudflare軟件包,該軟件包專門設計用於使用CloudFlare的基礎架構。
我們希望有更多的貢獻者參與!
首先,請閱讀我們的貢獻指南。
hono-rate-limiter項目受到快速速率限制的啟發