はじめに
本記事では、express-rate-limitを利用してAPIのリクエスト制限を実装します。一定時間内のリクエスト数を制限し、制限を超えた場合はリクエスト制限に引っかかってエラーを返すところまで試してみます。
環境
- Node:v20.1
- express:4.21
- express-rate-limit:7.4.1
インストール
パッケージをインストールします。
npm init -y
npm install express express-rate-limit
ソース
1分間に5回までのリクエストを許可し、それを超えるとエラーメッセージを返すように設定しています。
index.js
const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();
const limiter = rateLimit({
// 1分
windowMs: 60 * 1000,
// 1分間に最大5リクエスト
max: 5,
message: {
// 429 Too Many Requests https://developer.mozilla.org/ja/docs/Web/HTTP/Status/429
status: 429,
error: 'リクエスト数が制限を超えました。しばらく待ってから再度お試しください。'
}
});
// 全てのルートにリミッターを適用
app.use(limiter);
app.get('/', (req, res) => {
res.send('Hello World!');
});
const PORT = 3000;
// listen:APIコールを受け付けつける入口
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
実行
ターミナルで以下のコマンドを実行してサーバーを起動します。
node index.js
別のターミナルウィンドウを開き、curlコマンドを使って連続的にリクエストを送信します。
for i in {1..10}; do curl http://localhost:3000; echo; done
実行結果
最初の5回のリクエストは成功し、"Hello World!"が表示されます。6回目以降のリクエストは制限にかかり、エラーメッセージが表示されます。
$ for i in {1..10}; do curl http://localhost:3000; echo; done
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
{"status":429,"error":"リクエスト数が制限を超えました。しばらく待ってから再度お試しください。"}
想定通り5回のリクエスト制限が機能している事を確認できました。