hono-rate-limiterอัตราการ จำกัด มิดเดิลแวร์สำหรับ Hono ใช้เพื่อ จำกัด การร้องขอซ้ำไปยัง 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 รองรับที่เก็บข้อมูลภายนอกเพื่อซิงโครไนซ์จำนวน HIT ในหลายกระบวนการและเซิร์ฟเวอร์
โดยค่าเริ่มต้นจะใช้ MemoryStore อันนี้ไม่ได้ซิงโครไนซ์สถานะของมันในอินสแตนซ์ มันง่ายที่จะปรับใช้และมักจะเพียงพอสำหรับการป้องกันการละเมิดขั้นพื้นฐาน แต่จะไม่สอดคล้องกันในการรีบูตหรือในการปรับใช้กับกระบวนการหรือเซิร์ฟเวอร์หลายตัว
การปรับใช้ที่ต้องการขีด จำกัด อัตราการบังคับใช้อย่างต่อเนื่องควรใช้ร้านค้าภายนอก
นี่คือรายการร้านค้า:
| ชื่อ | คำอธิบาย |
|---|---|
| หน่วยความจำ | (ค่าเริ่มต้น) ตัวเลือกในหน่วยความจำง่าย ๆ ไม่แบ่งปันสถานะเมื่อแอปมีหลายกระบวนการหรือเซิร์ฟเวอร์ |
| @hono-rate-limiter/redis | ร้านค้าที่ได้รับการสนับสนุนจาก Redis ใช้กับ @vercel/kv และ @upstash/redis |
| @hono-rate-limiter/CloudFlare | ร้านค้าที่ได้รับการสนับสนุนจาก Cloudflare ใช้กับวัตถุที่ทนทาน WorkersKV และอัตราการ จำกัด API |
| อัตรา จำกัด-redis | ร้านค้าที่ได้รับการสนับสนุน Redis เหมาะสำหรับการปรับใช้ขนาดใหญ่หรือเรียกร้อง |
| อัตรา จำกัด-Postgresql | ร้านค้าที่ได้รับการสนับสนุน postgreSQL |
| อัตรา จำกัด อัตรา | ร้านค้าที่ได้รับการสนับสนุน |
| ร้านค้าคลัสเตอร์ | เครื่องห่อหุ้มร้านค้าหน่วยความจำที่แชร์สถานะในทุกกระบวนการบนเซิร์ฟเวอร์เดียวผ่านโหนด: โมดูลคลัสเตอร์ ไม่แบ่งปันสถานะในหลายเซิร์ฟเวอร์ |
| อัตราความจำที่แม่นยำ | ร้านค้าหน่วยความจำคล้ายกับหนึ่งในตัวยกเว้นว่าจะเก็บการประทับเวลาที่แตกต่างกันสำหรับแต่ละคีย์ |
| ราคา จำกัด ขนาด | รองรับฐานข้อมูลที่หลากหลายผ่าน Typeorm: MySQL, Mariadb, CockroachDB, SQLite, Microsoft SQL Server, Oracle, SAP HANA และอีกมากมาย |
| @Rlimit/Storage | ร้านค้า Rlimit แบบกระจายเหมาะสำหรับการปรับใช้หลายภูมิภาค |
ดูคู่มือนี้หากคุณต้องการสร้างร้านค้าของคุณเอง
keyGenerator กำหนดสิ่งที่จะ จำกัด การร้องขอมันควรแสดงถึงลักษณะเฉพาะของผู้ใช้หรือคลาสของผู้ใช้ที่คุณต้องการให้อัตราการ จำกัด ตัวเลือกที่ดีรวมถึงคีย์ API ในส่วนหัว Authorization เส้นทาง URL หรือเส้นทางพารามิเตอร์การสืบค้นเฉพาะที่ใช้โดยแอปพลิเคชันของคุณและ/หรือ ID ผู้ใช้หากคำแนะนำที่นี่ไม่ทำงานโปรดลองโพสต์คำถามเกี่ยวกับการอภิปรายของ GitHub หรือใน #Help Channel ของ 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 ได้รับแรงบันดาลใจอย่างมากจากการ จำกัด อัตราด่วน