hono-rate-limiterMiddleware limitante de tasa para Hono. Use para limitar las solicitudes repetidas a API públicas y/o puntos finales, como el reinicio de la contraseña.
Nota
La función keyGenerator debe definirse para que hono-rate-limiter funcione correctamente en su entorno. Asegúrese de definir la función keyGenerator de acuerdo con la documentación antes de usar la 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 admite almacenes de datos externos para sincronizar los recuentos de HIT en múltiples procesos y servidores.
Por defecto, se utiliza MemoryStore . Este no sincroniza su estado en todas las instancias. Es simple de implementar y, a menudo, suficiente para la prevención básica del abuso, pero será inconsistente entre reinicios o en implementaciones con múltiples procesos o servidores.
Las implementaciones que requieren límites de tasa más consistentes deben usar una tienda externa.
Aquí hay una lista de tiendas:
| Nombre | Descripción |
|---|---|
| Mudra | (predeterminado) Opción simple en memoria. No comparte el estado cuando la aplicación tiene múltiples procesos o servidores. |
| @Hono-tasa-limitador/Redis | Una tienda respaldada por Redis, utilizada con @vercel/kv y @upstash/redis . |
| @honor-thate-limiter/nubeflare | Una tienda respaldada por CloudFlare, utilizada con objetos duraderos, trabajadores y trabajadores, la API limitante de tarifas. |
| tasa-limit-redis | Una tienda respaldada por Redis, más adecuada para implementaciones grandes o exigentes. |
| tasa-limit-postgresql | Una tienda respaldada por postgreSQL. |
| tasa-limit-memcached | Una tienda respaldada por memoria. |
| tienda de clúster-memoria | Una envoltura de la tienda de memoria que comparte el estado en todos los procesos en un solo servidor a través del módulo de nodo: clúster. No comparte el estado en múltiples servidores. |
| limitación | Una tienda de memoria similar a la incorporada, excepto que almacena una marca de tiempo distinta para cada llave. |
| tytringorm-the-limit-store | Admite una variedad de bases de datos a través de Typeorm: MySQL, MariadB, CockroachdB, SQLite, Microsoft SQL Server, Oracle, SAP HANA y más. |
| @rlimit/Storage | Una tienda RLIMIT distribuida, ideal para implementaciones multirregionales. |
Eche un vistazo a esta guía si desea crear su propia tienda.
keyGenerator determina en qué limitar una solicitud, debe representar una característica única de un usuario o clase de usuario que desea limitar. Las buenas opciones incluyen claves API en encabezados Authorization , rutas o rutas de URL, parámetros de consulta específicos utilizados por su aplicación y/o ID de usuario.Si las sugerencias aquí no funcionan, intente publicar preguntas sobre las discusiones de GitHub o en el canal #Help de Hono Discord.
Cuando se trabaja con paquetes que no son compatibles oficialmente con hono-rate-limiter , puede encontrar problemas relacionados con el tipo. Estos pueden resolverse fácilmente refiriéndose a las discusiones en el #22, #10. Ejemplo -
rateLimiter ( {
// ...
store : new RedisStore ( {
sendCommand : ( ... args : string [ ] ) => redisClient . sendCommand ( args ) ,
} ) as unknown as Store ,
} ) ;hono-rate-limiter con trabajadores o páginas de Cloudflare Si está tratando de usar hono-rate-limiter en un entorno de CloudFlare (como trabajadores o páginas), puede encontrar el siguiente error:
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/ Esto sucede porque el almacén de memoria predeterminado utilizado por hono-rate-limiter no puede ejecutarse en el entorno CloudFlare debido a sus restricciones en las operaciones asíncronas globales.
Para resolver este problema, debe usar una tienda compatible para CloudFlare. Puede usar el paquete @hono-rate-limiter/cloudflare , que está específicamente diseñado para funcionar con la infraestructura de CloudFlare.
¡Nos encantaría tener más contribuyentes involucrados!
Para comenzar, lea nuestra guía contribuyente.
El proyecto hono-rate-limiter está fuertemente inspirado en el límite de tasas expresas