hono-rate-limiterОграничение промежуточного программного обеспечения для Хоно. Используйте для ограничения повторяющихся запросов для публичных 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 | Магазин Redis, используемый с @vercel/kv и @upstash/redis . |
| @hono-rate-limiter/cloudflare | Магазин с облачным нормом, используемый с долговечным объектом, работниками и работниками, ограничивающими API. |
| Ставка-LIMIT-REDIS | Магазин Redis, более подходящий для крупных или требовательных развертываний. |
| скорость-limit-postgresql | Магазин PostgreSQL. |
| Ставка-ограниченная | Магазин, поддерживаемый мемкашкой. |
| Кластер-память-магазин | Обертка хранилища памяти, которая делятся на всех процессах на одном сервере через модуль Node: Cluster. Не делится состоянием на нескольких серверах. |
| точная память-уровни-Limit | Хранение памяти, аналогичное встроенному, за исключением того, что он хранит отдельную метку времени для каждого ключа. |
| Sypeorm-Rate-Limit Store | Поддерживает различные базы данных с помощью Typemorm: MySQL, MariaDB, Tackroachdb, SQLite, Microsoft SQL Server, Oracle, Sap Hana и многое другое. |
| @rlimit/storage | Распределенный магазин Rlimit, идеально подходящий для многорегиональных развертываний. |
Посмотрите на это руководство, если вы хотите создать свой собственный магазин.
keyGenerator определяет, на что ограничить запрос, она должна представлять уникальную характеристику пользователя или класса пользователя, которого вы хотите оценить. Хороший выбор включает в себя ключи API в заголовках Authorization , пути или маршруты URL, конкретные параметры запроса, используемые вашим приложением, и/или идентификаторы пользователя.Если предложения здесь не работают, попробуйте разместить вопросы о дискуссиях GitHub или в канале #Help Hono Discord.
Работая с пакетами, которые официально не поддерживаются 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 в среде CloudFlare (например, работники или страницы), вы можете столкнуться с следующей ошибкой:
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 сильно вдохновлен экспресс-скоростью LIMIT