2012-03-21 13 views
2

これは非常に難解な問題で、私は小さなテストケースを作ることはできません。しかし、誰かがそれ以前のようなものに遭遇した可能性があります。NodeJSストリームの一時停止/再開はXMLHttpRequestでは機能しませんが、curlで機能しますか?

私はこのようなコード(restifyを使用して)持っている:

server.put("/whatever", function (serverRequest, serverResponse, next) { 
    serverRequest.pause(); 

    serverRequest.on("data", function (chunk) { 
     console.log("from outside", chunk); 
    }); 

    doSomeAsyncStuff(function (err) { 
     serverRequest.on("data", function (chunk) { 
      console.log("from inside", chunk); 
     }); 
     serverRequest.on("end", function() { 
      next(); 
     }); 

     serverRequest.resume(); 
    }); 
}); 

私はCURLを使用して、このサーバーをヒットした場合、これは素晴らしい作品を。しかし、私はXMLHttpRequestでそれを打つと、より少ない"from inside"ログ行を得るより私は"from outside"ログ行を行う。 ASAPを一時停止するための最善の努力にもかかわらず、データイベントの1つが失われているようです。

curl -X PUT -T file.pdf http://localhost:7070/whatever -v 

そしてここではXMLHttpRequestコードです(クロームの最近のバージョンで動作します):

var arrayBuffer = fromElsewhere(); 
var xhr = new XMLHttpRequest(); 

xhr.open("PUT", "http://localhost:7070/whatever"); 
xhr.setRequestHeader("Content-Length", arrayBuffer.byteLength); 
xhr.setRequestHeader("Content-Type", "application/pdf"); 
xhr.send(arrayBuffer); 

一つの顕著な違いがあることである。ここ


は、私が使用していますCURLコマンドですアップロード前にCURLはExpect: 100-continueを送信していますが、XMLHttpRequestはアップロードしていません。手動でヘッダーを追加しようとしましたが、実際にはあまり効果がありませんでした(つまり、Chromeは応答を待たず、元のリクエストとともにすべてのPDFデータを送信しました)。それでも、なぜこのことが影響を与えるのか分かりません。

+0

これについての回答がありましたか?もし私が実際にnodejsを使ってhttp応答を一時停止/再開できるのであれば? – akmsharma

答えて

3

これは、カール対XMLHttpRequestとは関係がありませんでしたが、代わりにthe fact that serverRequest.pause is only advisory; it doesn't actually pause right awayとなりました。つまり、それはかなり役に立たない。

だから、おそらくCURLの場合のタイミングは予想通りXMLHttpRequest場合にはタイミングがオフだったのに対し、pauseが実際に、働いていたことを十分によかった、と"from outside"dataイベントの一つは、「助言」のポーズをすり抜けることができました。

スレッドで議論されているように、これはさまざまな修正がありますが、私はこのストリーム/バッファ宇宙全体でかなり不安定ですので、この回答にはお勧めしません。

documentation pull requestを追加しました。実際にはpauseを使用しようとする人はいません。

+0

さて、 'pause' *は動作しますが、あなたが言及したように、それは勧告であり、非同期です。 'pause'の非常に有用な使用例は、上流から読み込んでクライアントに書き込むプロキシの中にあります。クライアントへの書き込みが 'false'を返す場合、バッファがいっぱいであることを意味し、バックエンドに' pause'を送ることができます。おそらくバックエンドからいくつかの追加のデータが送られますが、ファイルのすべてではありません。一時停止せずに、1 GBのファイルをプロキシすると、ファイル全体がメモリにバッファリングされます(Node.jsプロセスが爆発する)。私はこれが助けて欲しい! – jpetazzo

関連する問題