web-dev-qa-db-ja.com

ETIMEDOUTエラーの処理方法

この呼び出しでetimedoutエラーを処理する方法は?

 var remotePath = "myremoteurltocopy"
 var localStream = fs.createWriteStream("myfil");;
        var out = request({ uri: remotePath });
        out.on('response', function (resp) {
            if (resp.statusCode === 200) {
                out.pipe(localStream);
                localStream.on('close', function () {
                    copyconcurenceacces--;
                    console.log('aftercopy');
                    callback(null, localFile);
                });
            }
            else
                callback(new Error("No file found at given url."), null);
        })

もっと長く待つ方法はありますか?または、リモートファイルを再度要求しますか?

このエラーの正確な原因は何ですか?タイムアウトのみ?

17
mcbjam

これは、(timeoutリクエストモジュールオプションによって)指定された時間内にリクエストレスポンスが受信されない場合に発生します。

基本的にそのエラーを最初にキャッチするには、errorにハンドラーを登録する必要があるため、未処理のエラーout.on('error', function (err) { /* handle errors here */ })はスローされなくなります。さらなる説明 こちら

ハンドラーで、エラーがETIMEDOUTかどうかを確認し、独自のロジックif (err.message.code === 'ETIMEDOUT') { /* apply logic */ }を適用できます。

ファイルを再度リクエストする場合は、 node-retry または node-backoff モジュールを使用することをお勧めします。物事がずっと簡単になります。

もっと長く待ちたい場合は、 timeoutリクエストのオプションを自分で設定 に設定できます。タイムアウトなしに0に設定できます。

30

可能性のあるシステムエラーに言及するプロパティcodeのエラーオブジェクトを調べ、ネットワークコールが失敗するETIMEDOUTの場合、それに応じて行動します。

if (err.code === 'ETIMEDOUT') {
    console.log('My dish error: ', util.inspect(err, { showHidden: true, depth: 2 }));
}
5
张健健