2012-02-27 12 views
2

ファイルをgzipでメモリに保持したいときに、リクエストがクライアントから来たときに、gzippedデータを出力したい。しかし私は私のブラウザでエラー330メッセージを受け取ります(私は最新のバージョンのクロムを使用しています)nodejsサーバからの応答をGzippingするときのエラー330

以下のコードは私にはまっすぐに見えますが、他に何か紛失していますか?

gzippedData = buffer; 

var http = require('http'); 
var url = require('url'); 
var fs = require('fs'); 
var zlib = require('zlib'); 
var gzippedData = ''; 

//read file into memory 
fs.readFile('layout.html', function(err, data){ 
    if(err) throw err; 
    zlib.gzip(data, function(err, buffer) { 
    if (err) throw err; 
    gzippedData = buffer.toString('binary');   
    }); 
}); 


var server = http.createServer(function(req, res){ 
    var path = url.parse(req.url).pathname; 
    switch (path){ 
    case '/': 
     res.writeHead(200, {'content-encoding': 'gzip'}); 
     res.write(gzippedData); 
     res.end(); 
    break; 
    default: 
     res.writeHead(404); 
     res.write('404'); 
     res.end(); 
}}); 

server.listen(8080); 

答えて

0

変更

gzippedData = buffer.toString('binary');   

そして、あなたが行くように良いはずです!

編集:これは、res.writeがデフォルトで応答をutf8としてエンコードするためです。代わりにres.write(gzippedData, 'binary')に変更することもできますが、それは不要です。 js文字列を割り当ててもう一度エンコードするのではなく、バッファへの参照を保持するほうが安いです。

+0

これは機能します。歓声メイト! メモリにデータを保持するよりも、バッファへの参照を保持するほうが実際に安いですか? バッファへの参照を保持していないと、サーバーへの100万の要求(たとえば)がすべて必要です。ファイルからデータを取り出す データが既にメモリに保存されていると、安くなると思っていたので、あなたがやっていることがフラッシュされています... – chris

+0

1 milionリクエストの例を再度使用して、 100万回のリクエストで何百万回もgzipする必要があるでしょうか?確かにそれは、一度読んで、それをgzipppingし、すべての100万の要求のためにそれをメモリで保持するよりも高価になる必要がありますか? – chris

+0

私はあなたが私を誤解しなければならないと思います。ファイルは一度読み込まれます。唯一の違いは 'gzippedData = buffer'を許可すれば、そのバッファへの単一の参照を保持することだけです。 'gzippedData = buffer.toString( 'binary')'の場合は、そのメモリをjavascript文字列に割り当てる必要があります。そして、各リクエストで 'binary 'としてエンコードする必要があります。私はあなたがこのことについて私の言葉を取ってはいけないと言いますが、代わりにベンチマークを行います。 'process.memoryUsage()'はリクエスト間で(あるいはそれ自身のリクエストハンドラ内でさえ)記録することができます。それに 'ab'を行け! –

関連する問題