2017-06-22 6 views
1

私は現在APIにいくつかの変更を加えています。ここでの問題は、別のサーバーからデータを要求することですが、サーバーがリクエストを処理するために、セキュリティのためにトークンが有効であり、まだ生きている(トークンが2秒間続く、私は英語で正しくそれを置く方法を知らなかった、申し訳ありません)、そしてすべてがうまくいきます。トークンがOKでないなら、何も頼むことはできません。間隔を置いてリクエストを行うためのよりエレガントで効率的な方法は何ですか?

ここで、APIはトークンを最初に要求せずに要求を行い、現在のトークン(APIが起動されたときにトークンを要求するため)が無効である場合、エラーをキャッチし、新しいトークンを要求した後、再度要求を行います。

私はそれが好きではありません。私は、エラーをキャッチするのではなく、2秒ごとに新しいトークンを要求すると、はるかに簡単で明確になると感じています。

私はこれをどのようにエレガントで効率的な方法で達成できますか?私が今考えている最も基本的な形は、タイマーを使って2秒ごとに自己実行機能に約束することです。しかし、私はそれがそれを行うための最善の方法だとは思わない。助言がありますか?

+2

2秒ごとに新しいトークンを要求し続けるのは良い考えではありません。これは、特にトークンのほとんどが使用されなくなると、サーバーに不必要な余分な負荷をかけることになります。変数 'var validToken'を作成し、有効なトークンを受け取ったら' validToken = true'に設定し、 'setTimeout'を2秒間実行して' validToken = false'に設定してください。 'validToken == false'の場合、API呼び出しを行う前に新しいトークンを要求します。 – Hoyen

+0

はい、私はこれも尋ねるつもりでしたが、私は昼食のために外出しなければなりませんでした。 2秒の有効期限が本当に必要ですか?同様に、1〜2分でなければならないかもしれません。新しいトークンは、保留中のリクエストがある場合にのみ取得する必要があります。 – DragShot

+0

有効期限は、APIを作成したユーザーによって設定されますが、それは私の責任ではありません。 –

答えて

-1

ここで私の2セントは、現在のトークンが取得された時刻を、システム起動時のUTCまたはナノ秒からミリ秒単位で取得することができるため、送信前に有効期限に基づいて有効かどうかを確認できます要求。すでに期限が切れている場合は、リクエストを送信する前に新しいリクエストをプルするだけで、リクエスト/レスポンスを節約できます。トークンに関する情報(そのようなトークンが期限切れになる前の時間のような)は、送信プロトコルまたはデータフォーマットに依存して、トークン自体と共に配信されることが可能である。これはすべて1つのスレッド(またはその1つのグループ)で処理することができ、必要に応じて新しいトークンを取得するだけで、クライアントとサーバーの両方の帯域幅を節約できます。

希望すると、これが役立ちます。

+0

転送時間はどのように扱いますか?サードパーティ製のサーバーを扱っているので、DNSルックアップとネットワークルーティングがあるので、コードに以前にあったコードをすべて保持する必要があります。時間内にリクエストを送信した場合、実際にトークンをチェックするまでに2msも遅れていますか?それがRedisキャッシュにあり、自動期限切れの場合、バッファを追加することができないようになります。それはちょうどなくなってしまった。とにかく、あなたが制御できないものを先取りすることによって、ここには多くの縁があります。 – Norguard

-1

実際にポーリングについて特に優雅なものはありません。トークンを求めて、常にシステムを荒らすこともありません。

より洗練された解決策は、機能的な多形性、および再帰および/または連鎖を組み込むことです。

const handleInvalidToken = (request, token, data) => err => 
    invalidTokenErr(err) 
    ? getNewToken().then(token => request(token, data)) 
    : Promise.reject(err); 

const handleSomeRequest = (token, data) => 
    doAThing(token, data) 
    .catch(handleInvalidToken(doAThing, token, data)); 


handleSomeRequest(userData.token, request.body) 
    .then(handleSuccess) 
    .catch(handleCatastrophicFailure); 

あなたは今、あなたが持っていた狂気、無粋コードのすべてを撮影した、明確に理解されるべきでシンプルな機能と高階関数、に変え、そして明確に制御フローをマッピングされました。

関連する問題