2017-06-20 10 views
-1
router.route('...') 
.get(function(req, res, next) { 
    // This job() function doing some *long* async task and end of the task calling 3th param as callback  
    job(param1, param2, function(response) { 
    // printing response to console perfectly 
    console.log("callback fired", response); 
    res.send("response"); 
    }); 
}); 

そして私はcurlと私の要求をしています。ExpressJSの早期終了依頼

$ curl ... -m 300 
curl: (52) Empty reply from server 

カールが数分間応答を待っていると、私は空返事にエラーを取得しています。 cURLはの前に nodejsの印刷コールバックを発しましたメッセージです。

このリクエストをブラウザまたはPostmanで行うと同じエラーが発生します。

res.send(),res.end()の機能は、job()の非同期機能にはありません。私は立ち往生しました、どのように私はエラーを追跡し、見つけることができますか?

答えて

1

影響を受ける可能性のあるタイムアウトは2つあります。実際のネットワークトレースを見ることなく(要求が終了したときに何が起こるかを見るために)、あなたの問題の原因となっているタイムアウトを知ることはできません。しかし、あなたは両方の問題に取り組むだけで問題は解決します。

まず、curlにはタイムアウト値があります。デフォルトの設定は不明ですが、任意の値を自由に設定することができます。

curl --max-time 900 

ここで、値は秒単位です。

第2に、nodejs httpサーバーにはタイムアウトがあります。オープン要求に応答がないと、ソケットが閉じられます(これにより、デッドソケットは時間が経つにつれて蓄積しません)。 server.setTimeout()hereのドキュメントを見ることができます。 httpサーバー・オブジェクトのデフォルトは2分です(Expressに変更があるかどうかはわかりません)。

一般的な考えはこれです:serverオブジェクトは、HTTPサーバーのオブジェクト(ないエクスプレスappオブジェクト)になり

server.setTimeout(10 * 60 * 1000); // set response timeout to 10 minutes 

+0

私の問題はhttpサーバーのデフォルトのタイムアウト設定だと思っています。だから私はその値を2分から5分に増やし、私の問題は解決しました。ありがとうございました。 – Eray

関連する問題