hono-rate-limiterMiddleware limitador da taxa para Hono. Use para limitar solicitações repetidas a APIs públicas e/ou pontos de extremidade, como redefinição de senha.
Observação
A função keyGenerator precisa ser definida para que hono-rate-limiter funcione corretamente em seu ambiente. Certifique -se de definir a função keyGenerator de acordo com a documentação antes de usar a biblioteca.
# 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 suporta armazenamentos de dados externos para sincronizar a contagem de acertos em vários processos e servidores.
Por padrão, MemoryStore é usado. Este não sincroniza seu estado nas instâncias. É simples de implantar e geralmente suficiente para a prevenção básica de abuso, mas será inconsistente nas reinicializações ou em implantações com vários processos ou servidores.
As implantações que requerem limites de taxa aplicados de forma mais consistente devem usar um armazenamento externo.
Aqui está uma lista de lojas:
| Nome | Descrição |
|---|---|
| MemoryStore | (padrão) opção simples na memória. Não compartilha o estado quando o aplicativo possui vários processos ou servidores. |
| @Hono-Rate-Limiter/Redis | Uma loja apoiada por Redis, usada com @vercel/kv e @upstash/redis . |
| @Hono-Rate-Limiter/Cloudflare | Uma loja lastreada em nuvem, usada com objeto durável, trabalhadores e os trabalhadores classificam a API limitadora. |
| Taxa-Limit-Redis | Uma loja apoiada por Redis, mais adequada para implantações grandes ou exigentes. |
| Taxa-limit-PostGresql | Uma loja apoiada por Postgresql. |
| Taxa-limite-Memcached | Uma loja com apoio de memcach. |
| Loja de memória de cluster | Um invólucro de armazenamento de memória que compartilha estado em todos os processos em um único servidor através do módulo de cluster de nó: nó. Não compartilha o estado em vários servidores. |
| limite de taxa de memória precisa | Um armazenamento de memória semelhante ao embutido, exceto que armazena um registro de data e hora distintos para cada chave. |
| Typeorm-Rate-Limit-Store | Suporta uma variedade de bancos de dados via Typeorm: MySQL, Mariadb, Cockroachdb, SQLite, Microsoft SQL Server, Oracle, SAP HANA e muito mais. |
| @rlimit/armazenamento | Uma loja Rlimit distribuída, ideal para implantações multi-regionais. |
Dê uma olhada neste guia, se desejar criar sua própria loja.
keyGenerator determina o que limitar uma solicitação, ela deve representar uma característica única de um usuário ou classe de usuário que você deseja classificar o limite. Boas opções incluem teclas de API nos cabeçalhos Authorization , caminhos ou rotas de URL, parâmetros de consulta específicos usados pelo seu aplicativo e/ou IDs de usuário.Se as sugestões aqui não funcionarem, tente postar perguntas sobre discussões no Github ou no canal #Help de Hono Discord.
Ao trabalhar com pacotes que não são oficialmente apoiados pelo hono-rate-limiter , você pode encontrar problemas relacionados ao tipo. Estes podem ser facilmente resolvidos referindo -se às discussões em #22, #10. Exemplo -
rateLimiter ( {
// ...
store : new RedisStore ( {
sendCommand : ( ... args : string [ ] ) => redisClient . sendCommand ( args ) ,
} ) as unknown as Store ,
} ) ;hono-rate-limiter com os trabalhadores ou páginas de Cloudflare Se você está tentando usar hono-rate-limiter em um ambiente de nuvem (como trabalhadores ou páginas), poderá encontrar o seguinte erro:
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/ Isso acontece porque o armazenamento de memória padrão usado pelo hono-rate-limiter não pode ser executado no ambiente Cloudflare devido às suas restrições às operações assíncronas globais.
Para resolver esse problema, você precisa usar um armazenamento compatível para o CloudFlare. Você pode usar o pacote @hono-rate-limiter/cloudflare , projetado especificamente para trabalhar com a infraestrutura do Cloudflare.
Gostaríamos muito de ter mais colaboradores envolvidos!
Para começar, leia nosso guia contribuinte.
O projeto hono-rate-limiter é fortemente inspirado pelo limite de taxa expressa