2012-03-17 26 views
6

私は単純なNodeJS HTTPサーバーからさまざまな応答を試しています。 私が達成しようとしている効果は、Webページの視覚的レンダリングが高速です。応答はtransfer-encoding: chunked(右?)でブラウザにストリーミングされているので、私はページレイアウトを最初にレンダリングし、遅れて残りのデータをレンダリングできると思っていました。NodeJSでストリーミングHttp応答

var http = require('http'); 

http.createServer(function (req, res) { 
    res.writeHead(200, { 
     'Content-Type': 'text/html' 
     , 'Transfer-Encoding': 'chunked' 
    }); 
    res.write('<html>\n'); 
    res.write('<body>\n'); 
    res.write('hello '); 
    res.write('</body>\n'); 
    res.write('</html>\n'); 
    setTimeout(function() { 
     res.end('world'); 
    },1500); 
}).listen(3000, '127.0.0.1'); 

事は、代わりにそのres.write('hello')のインスタンスres.write(new Array(2000).join('1'))のためので、既に書き込まれたデータが十分な長さでない限り、応答がres.end('world')まで送信されないかのように思われることであるトリックを行うだろう。

データのサイズが十分に大きくなるまで、ノードは書き込みをバッファリングしていますか?その場合、チャンクサイズは設定可能ですか?

答えて

3

閉じるタグが読み取られるまで、ブラウザがデータをレンダリングしていない可能性があります。これをテストするには、htmlタグの代わりにプレーンテキストを出力してみてください。

ファイヤービッグ/クロムインスペクタに入力がありますか?

Related Question

http://nodejs.org/api/stream.html#stream_stream_write_string_encoding_fd

ストリームに与えられたエンコーディングで文字列を書き込み。 文字列がカーネルバッファにフラッシュされた場合はtrueを返します。 にfalseを返し、カーネルバッファがいっぱいであることを示し、そのデータは将来は に送信されます。

.write()の結果を出力します。 trueかfalseを返すかどうかを確認します。

+0

.write()の出力は両方とも 'true'です。あなたがリンクしている関連する質問は、これがプラットフォーム固有であることを示唆しています。それは何を意味するのでしょうか? クロムインスペクタは完了した応答時間のみを出力します。どちらの場合も同じです。 データも閉じタグが読み取られる前にレンダリングされます。プレーンテキストのみを使用する場合と同じ動作です。 – Daniel

+1

ブラウザ固有です。さまざまなブラウザで試してみてください。また、クロムインスペクタの[ネットワーク]タブでは、ページをリロードして[ネットワーク]タブの最初の項目をクリックすると、データが実際に表示されるようになります。右パネルの[プレビュー]タブを選択していることを確認してください - ここで私が話していることは次のとおりです:http://imgur.com/8CJD1 – Straseus

+0

はい、確かにそれは応答をバッファリングするブラウザのようです。私はcurlでリクエストを実行しようとしましたが、期待される動作が生成されました(レスポンスに行末\ nがないとカールしたように見えました) – Daniel

関連する問題