制限ノード.エクスプレス料金制限付きのJS API呼び出し


多くの理由のために、あなたはあなたのAPI呼び出しを制限する必要があるかもしれません:それはクラウドで余分なコストを避けるために、あなたのAPIを使用するためにフリーティアを作成するために、サードパーティ製API要件を満たすために、パフォーマンスの問題を防止することができます.私は、あなたがこのポストを読んでいるならば、この目的があなたの心で非常に明確で、あなたがちょうどそれを働かせる方法を理解しようとしていると信じています.ではこれにフォーカスしましょう.
The express-rate-limit 私たちのためのこの問題を解決するシンプルでまっすぐ進むライブラリです.それは最も完全なものではないが、この目標を達成するために軽量で高速な方法です.ほとんどの洗練されたオプションについては、Expressレート制限自体はすでに他のライブラリrate-limiter-flexible express-brute and express-limiter .

現在出発

パッケージのインストール
まず最初にノードが必要です.プロジェクト.そこでディレクトリを作成し、コマンドを実行しましたnpm init -y デフォルトパッケージを作成するにはJSONファイル.

次に、このアプリケーションの必要なパッケージをインストールしますexpressexpress-rate-limit
npm install express express-rate-limit

セットアップエクスプレス
実行を容易にするために、私のパッケージを更新します.JSONファイルとスタートスクリプトを追加します.このプロジェクトを実行するにはnpm start コマンド
...
  "scripts": {
    "start": "node index.js"
  },
...
次にインデックスを作成します.エントリディレクトリとなるルートディレクトリのjsファイル.
それで、私は最も一般的な急行スタートコードを置きます.
// express import
const express = require('express')
// express initialization
const app = express()

const PORT = 3000

// generic GET route that we will use for the tests
app.get('/', function (req, res) {
  return res.send('Hello World')
})

// server initialization 
app.listen(PORT, () => {
    console.log(`server started on port ${PORT}`)
})
それで、我々が動くときnpm start (or node index.js あなたがパッケージをジャンプするならば.JSON STEP )アプリケーションが動作していることを示すメッセージを表示します.

localhost:3000 ルートでは、Hello World 設定します.


レート制限の追加
私たちはすでにexpress-rate-limit 最初のステップでは、まず使い始めなければなりません.
ミドルウェアとしてのエクスプレス料金制限の仕事は、我々は単一のルート、アプリケーション全体またはサブルートのグループでそれを使用できることを意味します.
そのためには、急行はミドルウェアをどのように扱っているかを理解する必要がありますが、use 機能は、完全にそれをラップするために、ミドルウェアまたはリクエストハンドラーをAPIのルートに加えます.
あなたがExpressによってミドルウェア使用についてより多くを理解したいならば、あなたはexpress documentation .
さあ、使いましょう.
まずはエクスプレスインポートのすぐ下に我々のコードの急行制限をインポートする必要があります
// /index.js
const express = require('express')
const rateLimit = require('express-rate-limit')
// ...
次に、ミリ秒単位でタイムボックス( Windowms )を設定し、IPアドレスあたりのリクエスト数を最大にします.
// /index.js
const express = require('express')
const rateLimit = require('express-rate-limit')
const app = express()

const PORT = 3000

// Create the rate limit rule
const apiRequestLimiter = rateLimit({
    windowMs: 1 * 60 * 1000, // 1 minute
    max: 2 // limit each IP to 2 requests per windowMs
})

// Use the limit rule as an application middleware
app.use(apiRequestLimiter)

app.get('/', function (req, res) {
  return res.send('Hello World')
})

app.listen(PORT, () => {
    console.log(`server started on port ${PORT}`)
})
これはデフォルトレスポンスです.

そして、制限が超えられるとき、それはデフォルトメッセージを表示しますToo many requests, please try again later. :

そして、それはすでに働いている!
このメッセージを変更するには2つのオプションがあります.

  • paramとして渡されたオブジェクト内の"message "プロパティを追加しますrateLimit 機能
    const apiRequestLimiter = rateLimit({
        windowMs: 1 * 60 * 1000, // 1 minute
        max: 2, // limit each IP to 2 requests per windowMs
        message: "Your limit exceeded"
    })
    


  • 失敗した場合の処理にハンドラ関数を追加します.
    const apiRequestLimiter = rateLimit({
        windowMs: 1 * 60 * 1000, // 1 minute
        max: 2, // limit each IP to 2 requests per windowMs
        handler: function (req, res, /*next*/) {
            return res.status(429).json({
              error: 'You sent too many requests. Please wait a while then try again'
            })
        }
    })
    


  • ボーナス
    また、関数ハンドラを使用して、要求された要求に対して消費者の請求を開始します
    const apiRequestLimiter = rateLimit({
        windowMs: 1 * 60 * 1000, // 1 minute
        max: 2, // limit each IP to 2 requests per windowMs
        handler: function (req, res, next) {
          applyFeesForConsumer()
          next()
        }
    })
    
    あなたが要求をブロックしないように、ちょうど前に手数料を適用します.
    そして、それ!

    ありがとう
    これを読んでくれてありがとう.
    そこにはより多くの利用可能な機能と構成がありますexpress-rate-limit documentation APIリクエストを制御するためにこのライブラリをどのように使うのかは簡単な例でした.
    例とステップバイステップはthis repository 枝.
    私はそれがあなたを助けることを望む!