用node.js和Express来实现对API的调用限制
因为我想在Node.js+Express创建API时限制请求次数,所以我进行了实现,以下是实现的记录。
安装Redis
Redis是一种可持久化的内存数据库。
在Redis上保存访问信息并执行访问限制。
使用yum进行安装
# yum install -y redis
确认版本
# redis-server --version
Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7897e7d0e13773f
启动redis服务器
# sudo service redis start
express-limiter的使用
回数制限をするミドルウェアのインストール
npm install express-limiter --save
var express = require('express')
var app = express()
var client = require('redis').createClient()
var limiter = require('express-limiter')(app, client)
/**
* you may also pass it an Express 4.0 `Router`
*
* router = express.Router()
* limiter = require('express-limiter')(router, client)
*/
limiter({
path: '/api/action',//リクエストへのルートパス
method: 'get',//対象のメソッド get、post、put、delete、all
lookup: ['connection.remoteAddress'],//制限対象のキー(この場合IPアドレスで制限)
total: 150,// 150回制限
expire: 1000 * 60 * 60, //制限対象の時間(ms)この場合1時間
onRateLimited: function (req, res, next) {//リミットに到達した場合の処理
next({ message: 'Rate limit exceeded', status: 429 })
}
})
app.get('/api/action', function (req, res) {
res.send(200, 'ok')
})
path: リクエストへのルートパス
method: httpメソッド。get、post、put、delete、all
lookup: 制限対象になるキー
total: 制限回数
expire: 制限対象の時間(ms)
whitelist: function(req) ホワイトリストの関数
skipHeaders: レート制限のためにHTTPヘッダーの送信をスキップするかどうか
ignoreErrors: redisから生成されたエラーにより、ミドルウェアがnext()を呼び出すことができるかどうか。デフォルトはfalseです。
onRateLimited: Function リクエストが設定されたレート制限を超えたときに呼び出されます。
其他详细设置请参考这里。