私のサーバーに何らかのオーディオをストリーミングしようとしていて、それをユーザーが指定したサービスにストリームしようとすると、ユーザーはsomeHostName
そのタイプの要求をサポートできないことがあります。readable.on( 'end'、...)が決して解凍されない
私の問題は、それが起こるときclientRequest.on('end',..)
が解雇されることはありませんということですが、私はそれがsomeHostReq
にパイプされていますので、それはsomeHostName
は「間違った」ときめちゃくちゃますこれだと思います。
私の質問は:
は、ストリームclientRequest
パイプがそれと間違って何かを持っている場合でも、私はまだclientRequest.on('end',..)
が発射されていることをとにかくありますか?
もしそうでない場合:someHostReq
で何か問題が起きたことを「すぐに」検出するにはどうすればよいですか? someHostReq.on('error')
はしばらくしてから起動しません。
コード:
someHostName = 'somexample.com'
function checkIfPaused(request){//every 1 second check .isPaused
console.log(request.isPaused()+'>>>>');
setTimeout(function(){checkIfPaused(request)},1000);
}
router.post('/', function (clientRequest, clientResponse) {
clientRequest.on('data', function (chunk) {
console.log('pushing data');
});
clientRequest.on('end', function() {//when done streaming audio
console.log('im at the end');
}); //end clientRequest.on('end',)
options = {
hostname: someHostName, method: 'POST', headers: {'Transfer-Encoding': 'chunked'}
};
var someHostReq = http.request(options, function(res){
var data = ''
someHostReq.on('data',function(chunk){data+=chunk;});
someHostReq.on('end',function(){
console.log('someHostReq.end is called');
});
});
clientRequest.pipe(someHostReq);
checkIfPaused(clientRequest);
});
出力:正しいホスト名の場合は
:
pushing data
.
.
pushing data
false>>>
pushing data
.
.
pushing data
pushing data
false>>>
pushing data
.
.
pushing data
console.log('im at the end');
true>>>
//continues to be true, that's fine
間違ったホスト名の場合:
pushing data
.
.
pushing data
false>>>>
pushing data
.
.
pushing data
pushing data
false>>>>
pushing data
.
.
pushing data
true>>>>
true>>>>
true>>>>
//it stays true and clientRequest.on('end') is never called
//even tho the client is still streaming data, no more "pushing data" appears
私の質問が重複:
それはこれと同じではありません:node.js http.request event flow - where did my END event go?、OPはちょうどGETの代わりにPOST
それはこれと同じではありません作っていた:My http.createserver in node.js doesn't work?、ストリームが一時停止モードになっていました以下のどれも起こらなかったので:
次のいずれかの方法で流れるモードに切り替えることができます。
'data'イベントハンドラを追加してデータを待機します。
resume()メソッドを呼び出して明示的にフローを開きます。
データをWritableに送信するためにpipe()メソッドを呼び出します。
ソース:それはこれと同じではありませんhttps://nodejs.org/api/stream.html#stream_class_stream_readable
- :Node.js response from http request not calling 'end' event without including 'data' event、彼はちょうど
.on('data',..)
あなたは代わりに 'close'を聞いてみましたか? – aarosil
lisyen close threadとは何ですか? – bubakazouba
ストリームは 'close'イベントと' end'イベントを持っています。詳細は[here](https://nodejs.org/api/stream.html#stream_class_stream_readable) – aarosil