2016-08-07 5 views
0

APIルートとしてExpressを使用し、DBとしてMongoDBを使用してNode.js上のアプリケーションを使用しています。 私はラッフルを持っています。ラッフルには一度だけ参加する必要があります。 私は現在参加しているメモリ内の配列を使用していますが、同時に2つのAPIを要求すると、ユーザーは抽選で2回参加します。 抽選会に複数回参加できないようにするにはどうすればよいですか?1回のアクションを2回実行することから保護する

答えて

0

。つまり、同じ操作を2回行っても結果は変わりません。

たとえば、変数をインクリメントするインクリメント機能を呼び出すため倍倍(例えばxに2を追加することになる二回x++を呼び出す)をインクリメント得る変数をもたらし、ない冪等です。私はこれがあなたの現在のデザインの本質だと思っています。「あなたが同時に2つのAPIをリクエストすると、ユーザーは抽選で2回参加します。

偶数演算の例は、変数を値に設定することです。たとえば、var x = 1を複数回呼び出すと、値1xに割り当てられます。その行を何回呼び出しても、xは常に1になります。

あなたが始めるのに役立ついくつかのリソース:

0

ノードをmondodbに保存しておいてください。ノードを再起動してもこのリストを失いたくはありません。

"2回結合"問題については、APIにリクエストするクライアント側の機能を絞って、スロットル機能で渡された時間の間に1回しか呼び出せないようにしてください。

Exempleスロットル機能:

function throttle (callback, limit) { 
    var wait = false; 
    return function() { 
     if (!wait) { 
     callback.apply(this, arguments); 
     wait = true; 
     setTimeout(function() { 
      wait = false; 
     }, limit); 
     } 
    } 
} 

、今あなたの要求機能:あなたは冪等操作をサポートするためのワークフローを構築する必要があるだろう

var throttleApiFunc = throttle(apiFunc, 5000); 

// this can only trigger one time each 5 seconds 
throttleApiFunc(); 
+0

同じユーザながら1つのAPIルートに第2のユーザの要求を行うことを避ける方法リクエストは処理中ですか?私たちは多くのユーザーがいるので、しばらく待っていると悪いです。 –

+0

あなたはクライアント側でスロットルをしているので、ユーザーにとっては問題ではなく、待つことはなく、スロットルは発砲する前に待たずに(デバウンスします)、発射してから再び発砲することはできません。あなたはクライアント側を絞り込むので、同じユーザーが同時に処理する2つの要求ではなく、まさにあなたが望むものです。 – Gatsbill

+0

はい、Chromeコンソール($ .post( '/ api ...'))からリクエストを送信して不正行為を行っているユーザーもいます –

関連する問題