Menu
CoddyTech

期限付きカウンター

CoddyのNode.jsジャーニー「認証とセキュリティ」セクションの一部。レッスン 22/24。

固定ウィンドウでは、1つの開始時刻から試行回数を数えます。回数とともにsinceを保存します。1分間のウィンドウは、now - sinceが60000ミリ秒に達すると期限切れになります。

// この例では10秒間のウィンドウ
if (now - since >= 10000) {
    count = 0;
    since = now;
}
count += 1;

ウィンドウ内では、元の開始時刻を維持します。試行のたびに開始時刻を更新すると、待ち時間が延び続けてしまいます。この練習ではnowを指定するため、待たずに境界条件を試せます。稼働中のサーバーでは、Date.now()から現在時刻を取得します。ログインプロジェクトでも同じ{ count, since }レコードを使います。

challenge icon

チャレンジ

簡単

exercise.js で1分間の失敗記録を更新します。now - since が60000以上の場合、now を開始時刻として、新しい期間をカウント1で開始します。それ以外の場合はカウントを増やし、since はそのままにします。両方のフィールドを返します。

POST {"count":3,"since":0,"now":10000} の場合、期待される結果は {"count":4,"since":0} です。now:60000 の場合、期待される結果は {"count":1,"since":60000} です。

最初の GET /result では、提供された例 {"count": 2, "since": 1000, "now": 61000} を使用します。他の入力を試すには、JSON本文を指定して POST /result を使用します。

自分で試してみよう

export function exercise({ count, since, now }) {
    return { count: count + 1, since };
}

認証とセキュリティのすべてのレッスン

自分で練習してみよう: Expressプレイグラウンド