2017-03-10 10 views
0

NodeJSは、デフォルトのタイムアウト(2分)以内に応答が得られない場合、バックエンドAPI呼び出しを再試行します。これにより、POST/PUT/DELETE API呼び出しの問題が発生し、応答時間(> 2分)が長くなります。リクエストは、ユーザからの1回のリクエストに対して、複数回Nodejsからバックエンドに行きます。応答時間がnodeJSのデフォルト時間よりも長くなると、NodeJSはPOST/PUT/DELETE APIを再試行します

私の応答は毎回変わる可能性があるので、デフォルトのタイムアウトを増やしたくありません。

nodeJs/expressJSに設定がある場合は教えてください。そうすれば、nodeJSの再試行を完全に停止したり、POST/PUT/DELETE APIのみの設定をカスタマイズできます。私は私の要求を送信する方法の

例:事前に助けを

let express = require('express'); 
let router = express.Router(); 
let async = require('async'); 
let expressListRoutes = require('express-list-routes'); 

async.parallel([ 
    function() { 
     //url: resource/add/ 
     router.post('/add', function (req, res) { 

      let uiModel = req.body; 
      let outputJson = Parser.parse(uiModel, 'CREATE'); 
      let requestPromiseModel = { 
       uri: `${RESOURCES}/${uiModel.resourcePluginId}`, 
       method: HttpMethod.POST, 
       json: true, 
       body: outputJson, 
       headers: { 
        'Accept': MIMETypes.APPLICATION_JSON, 
        'Authorization': MIMETypes.TOKEN_TYPE + req.token 
       }, 
       resolveWithFullResponse: true 
      }; 
      rp(requestPromiseModel).then(function (results) { 
       res.send(results); 
      }).catch(function (err) { 
       log.error(`Error: Create Resource Action: ${err}`); 
       res.send(err.response); 
      }); 
     }); 
    } 

]); 

expressListRoutes({prefix: '/resource'}, "API:", router); 

module.exports = router;  

おかげで:)

+0

リクエストをバックエンドに送信するために使用しているコードの例を投稿できますか? – Matt

+0

私の例では、nodejsからBEへのリクエストをどのように送っていますか? –

答えて

0

コード内async.parallelの使用は無用です。 1つの関数しか実行していないので、1つの関数を並行して実行することはあまり意味がありません。また、その関数は、最初の引数としてasync.parallelによって提供されるコールバックを呼び出さないので、async.parallelは決して終了しないと考えます。あなたが知っているよう

async.parallel([ 
    function() { 
     router.post(
      // ... 
     ); 
    } 
]); 

router.post(
    // ... 
); 

の代わりに、:そしてさらに悪いことに、あなたがその関数で行うすべてがとして直接呼び出すことができコールrouter.post()です。

唯一のことは、router.post()が呼び出される前にexpressListRoutes({prefix: '/resource'}, "API:", router);を呼び出す可能性があるということです。

を使用しないでreq.bodyを使用しています。

そして最後に、ここにrequestrequest-promiseのタイムアウトを定義する方法です - ドキュメントを参照してください。

タイムアウト - 整数を待機するミリ秒数を含みます要求を中止する前に応答ヘッダーを送信する(そして応答本体を開始する)サーバー。基礎となるTCP接続が確立できない場合、OS全体のTCP接続タイムアウトはタイムアウトオプションを無効にします(Linuxのデフォルトは20〜120秒のどこかにあることができます)。

OSのタイムアウトが優先されていないことを確認してください。

+0

async.parallel bcozを定義しました。私は複数のAPI呼び出しを持つ多くの関数を持っています...その例です。私はこのようなシナリオを持っています...リクエストがすでにバックエンドに達していて、何らかの操作を行うための時間がかかる場合...この場合、「タイムアウトはどのように働くのですか」? –

関連する問題