- Published on
ทำ Rate limit ใน express ด้วย express-rate-limit
ก่อนอื่นต้องสวัสดีคุณผู้อ่านทุกท่านเน้อครับ เนื่องจากช่วงที่ผ่านมานี้ได้ทำเทสการรับสมัครพนักงานบริษัทแห่งหนึ่ง แล้วมีคะแนนพิเศษ หากทำ rate limit ใน API มาด้วย ในตอนแรกเข้าใจผิดคิดว่าเป็น rating 555+ ไม่ได้เกี่ยวกับเล๊ยยยย
Rate Limit คืออะไร
ตามความเข้าใจของเจมส์คือเหมือนเป็นการจำกัดจำนวนการเรียกใช้งาน API ในช่วงเวลาหนึ่งตามที่กำหนด เช่น กำหนดให้ใน 1 นาทีจำกัดให้เรียก API ได้แค่ 10 ครั้ง เป็นต้น
มาเริ่มกันเลย
ขั้นแรกให้สร้าง directory สำหรับ project ขึ้นมาก่อนครับ ในที่นี้เจมส์จะใช้ว่า example-rate-limit
เน้อครับ
mkdir example-rate-limit
จากนั้นให้เข้าไปใน project
cd example-rate-limit
สร้าง package.json
ขึ้นด้วยคำสั่ง
npm init -y
จากนั้นให้ install express
, express-rate-limit
npm install --save express express-rate-limit
สร้างไฟล์ server.js
และใส่โค้ดลงไปดังนี้ครับ
const express = require("express");
const rateLimit = require("express-rate-limit");
const app = express();
const PORT = 2000;
const limiter = rateLimit({
windowMs: 60 * 1000,
limit: 20,
message: "Too many request",
});
app.get("/", (req, res) => {
return res.json({ success: true });
});
app.get("/limit-to-access", limiter, (req, res) => {
res.json({ success: true });
});
app.listen(PORT, () => {
console.log(`Running on port: ${PORT}`);
});
จากนั้นเปิด Terminal ขึ้นมาแล้วสั่ง
node server.js
ถ้าหากเป็นแบบตัวโค้ดข้างต้น เราจะกันแค่ API
/limit-to-access
ที่จำกัดการเข้าถึงเท่านั้น คือ ใน 1 นาทีจะจำกัดการ access ได้ 20 request
เมื่อลองเข้า http://localhost:2000/limit-to-access ลองเข้า 21 รอบ ใน 1 นาที จะพบว่ารอบที่ 21 นั้นจะขึ้นข้อความว่า "Too many request" ขึ้นมา
แต่ถ้าหากเข้า http://localhost:2000 จะเข้าได้ปกติ
ถ้าหากต้องการป้องกันทุก Route ก็สามารถเขียนเป็น middleware แบบนี้ได้ครับ
const express = require("express");
const rateLimit = require("express-rate-limit");
const app = express();
const PORT = 2000;
const limiter = rateLimit({
windowMs: 60 * 1000,
limit: 20,
message: "Too many request",
});
app.use(limiter)
app.get("/", (req, res) => {
return res.json({ success: true });
});
app.get("/limit-to-access", (req, res) => {
res.json({ success: true });
});
app.listen(PORT, () => {
console.log(`Running on port: ${PORT}`);
});
เพียงเท่านี้ก็จะจำกัดการเข้าถึงได้แล้วครับคือ 1 นาที จะจำกัดแค่ 20 request (ทั้งสอง route รวมกัน)
ในส่วน message เราสามารถ config เป็นแบบ JSON ได้ครับ เวลา request เกินที่ limit ก็จะ response message แบบ JSON กลับไป
บทความนี้ถ้ามีส่วนไหนผิดพลาดประการใดก็ขออภัยมา ณ ที่นี้ด้วยเน้อครับ หากมีข้อสงสัย หรืออยากสอบถามอะไรสามารถพิมพ์ทิ้งไว้ได้เน้อครับ