2017-02-17 12 views
1

HTTPS要求にファイルをパイプしているのに、正常に動作しますが、99.9%の呼び出しが発生しますが、サーバーやネットワークが利用できない場合があります。node.jsストリームパイプによるタイムアウト処理

これは明らかに作業し、手動で再起動を必要とする停止する自分のアプリケーションを引き起こす

...

ノードのドキュメント上で示唆したように、私は、時折今requestオブジェクトに次のエラーコードを使用して、その常に完全にハングアップするために使用される他のhttps接続を持っています:

request.on('socket', function(socket) { 
    socket.setTimeout(10000); 
    socket.on('timeout', function() { request.abort(); }); 
}); 

request.on('error', function(e) { 
    // Handle the error... 
    console.error("FAILED!"); 
}); 

...宛先がファイルストリームにパイプされている場合は、リクエストのタイムアウトが無視されるようですが、ファイルシステムオブジェクトのタイムアウトでエラーを処理する必要がありますが、イベントIがある場合はドキュメントが明確ではありませんあなたがハングアップしてみたい場合は

var https = require('https'), 
    fs = require('fs'); 

var opts = { 
     host: 'www.google.com', 
     path: '/', 
     method: 'GET', 
     port: 443 
}; 

var file = fs.createWriteStream('test.html'); 

var request = https.request(opts, function(response) { 
    response.pipe(file); 
    file.on('finish', function() { 
     file.close(function(){ 
      console.log("OK!"); 
     }); 
    }); 
}); 

request.on('socket', function(socket) { 
    socket.setTimeout(10000); 
    socket.on('timeout', function() { request.abort(); }); 
}); 

request.on('error', function(e) { 
    console.error("FAILED!"); 
}); 

request.end(); 

ホストパスを変更します。私は、誰かが私を助けることを願って、ここで

は、サンプルコードです...「完了」を除くために待たなければなりませんは巨大なファイルで、転送中にネットワークケーブルを切断すると、10秒後にタイムアウトするはずですが、...

答えて

1

非常に遅い応答とサンプルコードに似たクライアントを送信するdemo node.js httpサーバーをセットアップしました。

私はクライアントを起動し、応答を送信するときに、サーバーを停止し、その後、私はまた、ソケットのtimeoutイベントを得ることはありませんが、私は、クライアント内の応答にendイベント取得:

var request = https.request(opts, function(response) { 
    response.pipe(file); 
    file.on('finish', function() { 
     file.close(function(){ 
      console.log("OK!"); 
     }); 
    }); 
    response.on('end', function() { 
     // this is printed when I stop the server 
     console.log("response ended"); 
    }); 
}); 

`` `

多分あなたはそのイベントを聞くことができましたか?

+0

問題は、tansferが終了したときにも 'end'が出力されることです。中断したりタイムアウトしたりするだけでなく、エラーを検出する方法が必要です。 – gabry

関連する問題