2017-10-18 7 views
0

私は、単一の要求でうまく動作する平均アプリケーションを持っています。/api/products?pid=500と呼んでみましょう。しかし、私は最近、リクエストのバースト(私は、約50の製品= 50のリクエスト、ポストデータで/api/products?pid=500 *** 550)を更新すると、req.bodyが新しいリクエストの値を取得することがあることを発見しました。平均ノードJSは多くのリクエストで性交を要求します

フロントアプリは、選択した製品のforeachの中のコールます:

ds.forEach((d, key) => { 
     this.ApiCall.setData('products', { action: 'send-product', data: d }) 
      .subscribe((result) => { 
       //we have results 
      }); 
     }); 
    //setData makes a http.post().map 

をバックアプリ/平均はポストを分析し、コードを合成してみました:

router.route('/') 
.post(function (req, response) { 
    if(req.body.data){ 
     var obj = { id: req.body.data.product_id } 
     if(req.body.data.linked_products){ 
      req.body.data.linked_products.forEach(function(entry) { 
       obj.linked = entry; //more ifs 
      }); 
     } 
     var async = require('async'); 
     async.series({ 
      q2: function(cb){ 
       queryProducts.findOne({id: req.body.data.product_id, null).exec(cb); 
      }, 
      q3: function(cb){ 
       queryCategories.findOne({id: req.body.data.category_id, null).exec(cb); 
      } 
      }, function(err, qResults){ 

      var alreadysent = false; 
      if (qResults.q3) qResults.q3.logs.forEach(function(entry) { 
       if(entry.sent){ 
        alreadysent = true; 
       } 
      }); 
      //more ifs 
      qResults.q3.external_codes.forEach(function(entry) { 
       obj.external_code = entry;//more ifs 
      }); 
      if(req.body.data.price < 0){ 
       response.json({message: "Negative price didn't sent"}); 
       return; 
      } 
      if(qResults.q2.status=="inactive"){ 
       response.json({message: "Inactive didn't sent"}); 
       return; 
      } 
      req.body.data.campaigns(function(entry) { 
       obj.price_offers = entry;//more ifs 
      }); 
      //more ifs and foreach similar 
      queryProducts.update({id: req.body.data.id}, {$push: { synced_products: obj }}, function (err, result) { 
       //HERE I found req.body.data with values of a future request 

       if(!err) 
        response.json({message: "Sent"}); 
       return; 
      }); 
     }); 
    } 
}); 
module.exports = router; 

私は要求を行うことを理解

/api/products?pid=500 
/api/products?pid=501 
/api/products?pid=502 
/api/products?pid=503 
... 

はタイミングが異なりますが、リクエスト(pid = 501)、最後のreq.bodyをreq.bodyの値が新しいreq(pid = 503)と呼んでいますか? どのように避けるべきアイデアですか?投稿後に最初に非同期を設定するか、

var reqbody = req.body 

ありがとう!

+2

問題を示す[mcve]で質問を更新してください。引用符で囲まれたコード( 'post'コールでparenとsemiが足りないと仮定した場合)は、リクエスト間のデータ出血に問題がないはずです。 –

+0

@ T.J。クラウダー申し訳ありませんが、コードを更新しました、ありがとう! – Mihai

+0

'var'の代わりに' let'を使ってみてください。 – Sagar

答えて

1

これはasyncモジュールの初期化によるものだと思います。 node docsから引用すると:

キャッシュ

モジュールは、彼らがロードされた最初の時間の後にキャッシュされます。つまり、require( 'foo')へのすべての呼び出しは、同じファイルに解決される場合、返されたオブジェクトと全く同じオブジェクトを返すことを意味します(とりわけ)。

require( 'foo')を複数回呼び出しても、モジュールコードが複数回実行されることはありません。これは重要な機能です。これにより、「部分的に完了した」オブジェクトを返すことができ、サイクルを引き起こした場合でも推移的な依存関係をロードすることができます。

モジュールにコードを複数回実行させるには、関数をエクスポートし、その関数を呼び出します。

要求のバーストが重複して実行されると、async変数の2つ(またはそれ以上)の使用が「同時に」変更されます。私はasync変数へのアクセスを制御するためにある種のミューテックスを使用することを提案します。

関連する問題