Published on

ทำ Rate limit ใน express ด้วย express-rate-limit

ทำ Rate limit ใน express ด้วย express-rate-limit
ทำ 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 และใส่โค้ดลงไปดังนี้ครับ

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 แบบนี้ได้ครับ

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.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 กลับไป

บทความนี้ถ้ามีส่วนไหนผิดพลาดประการใดก็ขออภัยมา ณ ที่นี้ด้วยเน้อครับ หากมีข้อสงสัย หรืออยากสอบถามอะไรสามารถพิมพ์ทิ้งไว้ได้เน้อครับ