複数の要求にタイムアウトのNode.jsサーバーへの要求

マイク・メドウズ:

スーパー私と一緒にクマので、ノードを経験していないよ、私はそう。

私は、Node.jsのサーバー上の2つのルートがあります。典型的な日中は、両方のルートが同時に要求にヒットします。ルート1ルート2を一時停止させるリソースを占有しますので、ルート1がスムーズに実行されますが、ルート2は、いくつかの約束を返す長い実行中のプロセスをある(私は、これはデータログを経由して起こっているのを確認しました)。

ルートこのような1つのルックス:

  app.post('/route1', function (req, res) {
    doStuff().then(function(data){
      res.end();
    })
  }

経路2は一度に処理されたアレイに1のでレコードを通って解析する必要があるデータの配列を処理しています

app.post('/route2', function (req, res){
 async function processArray(array) {
      for (const item of array) { 
         await file.test1()(item, res);
           await file.test2()(item, res);
             //await test3,test4,test5,test6 
      }
  }
  processArray(data).then(function() {
    res.end();
  }
}

私はこの問題を推測しているので、それはプロセスのレコードを続行する前に、リソースが利用可能になるため、非同期/のawaitが待っていることです。
route1のはroute2に干渉しない場所にこれを書くために私のための方法はありますか?

マックス:

ノードでは、あなたができるほぼすべてawaitのための(またはお電話thenでの)は、非同期です。これは、実行スレッドをブロックするのではなく、あなたがコントロールする、と何か他の作業に無料でありながら、それが終了されるためにそしてちょうど待っていない別の層にタスクをオフロードしません。これは、ファイルシステムやネットワークのリクエストでの作業が含まれます。そこに、例えば、まだスレッドをブロックする方法は、(ファイルシステムのようなメソッドの同期バージョンを使用して、あるreadFileSync代わりにreadFile(4569485960485096の階乗の計算など))、またはJavaScriptに重い計算を行います

あなたのroute1のを考えると、こののいずれかを実行していない、それはroute2から任意のリソースを取ることはありません。彼らは、並列に実行されています。実際のコードを見ることなく伝えるのは難しいことをだが、ノードに関連していない理由のために、あなたのroute2が不十分書かれているので、私はかなり確信して、あなたは接続タイムアウトを取得していることだし、それを解決するのに長い時間がかかる(あるいはまったく解決しません)パフォーマンスやブロッキング。6つのすべての配列項目の時刻(またはそこに起こっているものは何でも)、それらの無限のテストを実行するためにファイルシステムを待っている間にノードがちょうど冷却され、この問題が発生している間、ブラウザが応答やショーあなたの接続タイムアウトを待って停止します。それはあなたがだけでなく、すべてのそれらを並行して実行されているデータ内のすべてのアレイ上のすべてのテストのために待機する必要がないことが最も可能性があります

続きを読むここhttps://nodejs.org/en/docs/guides/blocking-vs-non-blocking/、ここhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /約束/すべて

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=282948&siteId=1