題目如下
Dcard 每天午夜都有大量使用者湧入抽卡,為了不讓伺服器過載,請設計一個 middleware:
- 限制每小時來自同一個 IP 的請求數量不得超過 1000
- 在 response headers 中加入剩餘的請求數量 (X-RateLimit-Remaining) 以及 rate limit
- 歸零的時間 (X-RateLimit-Reset)
- 如果超過限制的話就回傳 429 (Too Many Requests)
- 可以使用各種資料庫達成
這題我是使用Koa@2來實作,順便當作練習Koa,之前雖然寫過ExpressJS,但是Koa跟Express有點不太一樣,可是轉換起來應該還是可以無縫接軌!
起手式
首先就先簡單的引入yarn(npm)來安裝koa!我是用yarn,所以下面範例都是用yarn來當做範例!
整個middleware流程大概是
routing -> get ip -> query database -> return res and set headers
==> null -> add a new data row
==> validity period -> update data
==> expired -> update
==> validity period && too many req-> reject request
|
|
引入Koa並測試
|
|
執行伺服器
|
|
在瀏覽器正常來說會看到 ‘Hello world’!
開始編寫Middleware
新建一個middleware.js
,必且在主js引入後使用它。
Middleware.js
|
|
App.js
|
|
node app.js
執行node app.js
後,到瀏覽器觀看網站,會得到一樣的Hello world
,但是不一樣的是回去看Terminal,會發現多了一條middleware test log
,因為我們有app.use(RateLimit())
,只要經過所有的路由都會先經過這個middleware。
引入資料庫
題目上面說任何資料庫都可以使用,這樣我這邊是用MySql,所以下面會教如何使用。
Install Mysql
|
|
middleware.js
這邊會在載入的時候會需要一些options,所以我們需要在function params裡面加入一些參數,並且使用es6解構來解構Params。