hono-rate-limiter호노의 미들웨어 제한 속도. 반복 된 요청을 공개 API 및/또는 암호 재설정과 같은 엔드 포인트로 제한하는 데 사용하십시오.
메모
hono-rate-limiter 귀하의 환경에서 제대로 작동하려면 keyGenerator 기능을 정의해야합니다. 라이브러리를 사용하기 전에 문서에 따라 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 와 함께 사용되는 Redis 지원 매장. |
| @hono-rate-limiter/cloudflare | 내구성있는 물체, Workerskv 및 Workers와 함께 사용되는 Cloudflare 지원 매장은 API를 제한합니다. |
| 속도-제한-빨간색 | 크고 까다로운 배포에 더 적합한 Redis 지원 매장. |
| rate-limit-postgresql | PostgreSQL 지원 상점. |
| 속도 제한-모임 | 멤버가 된 가게. |
| 클러스터 메모리 스토어 | 노드 : 클러스터 모듈을 통해 단일 서버의 모든 프로세스에서 상태를 공유하는 메모리 스토어 래퍼. 여러 서버에서 상태를 공유하지 않습니다. |
| 정확한 메모리 속도 제한 | 각 키에 대해 뚜렷한 타임 스탬프를 저장한다는 점을 제외하고는 내장과 유사한 메모리 저장소와 비슷합니다. |
| Typeorm-rate-limit 스토어 | MySQL, MariaDB, CockroAchdb, Sqlite, Microsoft SQL Server, Oracle, SAP HANA 등의 다양한 데이터베이스를 지원합니다. |
| @rlimit/스토리지 | 다중 지역 배치에 이상적 인 분산 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 환경 (예 : 작업자 또는 페이지)에서 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에서 크게 영감을 받았습니다