用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 リクエストが設定されたレート制限を超えたときに呼び出されます。

其他详细设置请参考这里。

广告
将在 10 秒后关闭
bannerAds