hono-rate-limiterNilai Middleware Membatasi untuk Hono. Gunakan untuk membatasi permintaan berulang ke API publik dan/atau titik akhir seperti reset kata sandi.
Catatan
Fungsi keyGenerator perlu didefinisikan untuk hono-rate-limiter agar bekerja dengan baik di lingkungan Anda. Harap pastikan bahwa Anda mendefinisikan fungsi keyGenerator sesuai dengan dokumentasi sebelum menggunakan pustaka.
# 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 mendukung penyimpanan data eksternal untuk menyinkronkan jumlah hit di berbagai proses dan server.
Secara default, MemoryStore digunakan. Yang ini tidak menyinkronkan keadaannya di seluruh contoh. Ini mudah digunakan, dan seringkali cukup untuk pencegahan penyalahgunaan dasar, tetapi akan tidak konsisten di seluruh reboot atau dalam penyebaran dengan banyak proses atau server.
Penyebaran yang membutuhkan batas tingkat yang ditegakkan secara lebih konsisten harus menggunakan toko eksternal.
Berikut adalah daftar toko:
| Nama | Keterangan |
|---|---|
| Toko memory | (default) Opsi dalam memori sederhana. Tidak berbagi status ketika aplikasi memiliki banyak proses atau server. |
| @hono-rate-limiter/redis | Toko yang didukung Redis, digunakan dengan @vercel/kv dan @upstash/redis . |
| @hono-rate-limiter/cloudflare | Toko yang didukung Cloudflare, digunakan dengan objek yang tahan lama, pekerja dan pekerja tingkat membatasi API. |
| redis batas tingkat | Toko yang didukung Redis, lebih cocok untuk penyebaran besar atau menuntut. |
| rate-limit-postgresql | Toko yang didukung PostgreSQL. |
| MEMCACHED RATE-LIMIT | Toko yang didukung memcached. |
| Kluster-memori-store | Pembungkus toko memori yang berbagi status di semua proses pada satu server melalui modul node: cluster. Tidak berbagi keadaan di beberapa server. |
| Tekaman-memori-rate-limit | Toko memori yang mirip dengan yang bawaan, kecuali bahwa ia menyimpan cap waktu yang berbeda untuk setiap kunci. |
| Typeorm-rate-limit-store | Mendukung berbagai basis data melalui Typeorm: MySQL, MariaDB, CokroachDB, SQLite, Microsoft SQL Server, Oracle, SAP HANA, dan banyak lagi. |
| @rlimit/penyimpanan | Toko Rlimit terdistribusi, ideal untuk penyebaran multi-regional. |
Lihatlah panduan ini jika Anda ingin membuat toko sendiri.
keyGenerator menentukan apa yang harus membatasi permintaan, itu harus mewakili karakteristik unik dari pengguna atau kelas pengguna yang ingin Anda nilai batas. Pilihan yang baik termasuk kunci API dalam header Authorization , jalur URL atau rute, parameter kueri spesifik yang digunakan oleh aplikasi Anda, dan/atau ID pengguna.Jika saran di sini tidak berfungsi, coba posting pertanyaan tentang diskusi github atau di saluran #help Hono Discord.
Saat bekerja dengan paket yang tidak secara resmi didukung oleh hono-rate-limiter , Anda mungkin mengalami masalah terkait jenis. Ini dapat dengan mudah diselesaikan dengan merujuk pada diskusi di #22, #10. Contoh -
rateLimiter ( {
// ...
store : new RedisStore ( {
sendCommand : ( ... args : string [ ] ) => redisClient . sendCommand ( args ) ,
} ) as unknown as Store ,
} ) ;hono-rate-limiter dengan pekerja atau halaman cloudflare Jika Anda mencoba menggunakan hono-rate-limiter di lingkungan cloudflare (seperti pekerja atau halaman), Anda dapat menemukan kesalahan berikut:
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/ Ini terjadi karena penyimpanan memori default yang digunakan oleh hono-rate-limiter tidak dapat berjalan di lingkungan CloudFlare karena pembatasannya pada operasi asinkron global.
Untuk menyelesaikan masalah ini, Anda perlu menggunakan toko yang kompatibel untuk CloudFlare. Anda dapat menggunakan paket @hono-rate-limiter/cloudflare , yang secara khusus dirancang untuk bekerja dengan infrastruktur CloudFlare.
Kami ingin memiliki lebih banyak kontributor yang terlibat!
Untuk memulai, silakan baca panduan berkontribusi kami.
Proyek hono-rate-limiter sangat terinspirasi oleh Express-Rate-Limit