2017-03-05 7 views
0

expressを使用しています。reqをリモートサーバーにパイプしてパイプして結果をパイプに戻そうとしていますクライアント:resうまく動いていますが、resconnect-timeoutというアクションで終了し、write after endというエラーが発生することがあります。私は、ログに次のように表示さnode.jsパイプがリモートサーバーに接続され、resに戻る:res終了後にパイプをresに分割する方法

var onErrorA = function (err) { console.log('error piping to destination:', err); }; 
var onErrorB = function (err) { console.log('error piping to res:', err); }; 
var onEndA = function() { console.log('pipe to destination ended'); }; 
var onEndB = function() { console.log('pipe to res ended'); }; 

var destination = request(destinationUrl); 

req.pipe(destination) 
    .on('error', onErrorA) 
    .on('end', onEndA) 
    .pipe(res) 
    .on('error', onErrorB) 
    .on('end', onEndB); 

error piping to res: Error: write after end 
pipe to destination ended 

私は場合

私のコードは次の行(私はデバッグの目的のためにログを無理しています)に沿って、現在あります何が起こっているのかを確認したら、resが終了した(タイムアウトすると)パイプラインを中断する(resへの書き込みを停止する)のですか?

私は(req.timedoutconnect-timeoutによってtrueに設定されている場合)resが終了したときに試してみてキャッチするために、以下の線に沿って何かをしようとしました:

var destination = request(destinationUrl); 

var readable = req.pipe(destination); 
var onData = function (chunk) { 
    if (req.timedout) { 
     // prevent any further writing to res by unpiping it... 
     readable.unpipe(res); 
    } 
}; 

// https://nodejs.org/api/stream.html#stream_event_data 
readable.on('data', onData); 

readable.pipe(res); 

しかし、私はちょうど次のエラーを取得します:

TypeError: readable.unpipe is not a function 

はなぜreadableの機能unpipeではないでしょうか?

私が欲しいものを達成する方法に関する提案はありますか?

答えて

0

だから、私はアプローチがうまくいくと思った。それが最良のアプローチであるかどうかはわかりませんが、うまくいくようです。これを行うためのよりよい方法で他の答えは見て興味深いでしょう。私がやった何

finishイベントのためにresにリスナーを添付することであり、それは発射したときにそれ以上のデータがresに書き込まれないように、私は、先の読めるストリームを一時停止:

var destination = request(destinationUrl); 
var readable = req.pipe(destination); 
var readableEnded = false; 
readable.on('end', function() { readableEnded = true; }); 
readable.pipe(res); 
res.on('finish', function() { 
    if (!readableEnded) { 
     readable.pause(); 
     destination.end(); 
    } 
}); 
関連する問題