2012-09-25 10 views
7

私はnode.jsが新しく、JSON結果を含むzipファイルを送り返そうとしています。 私はそれを行う方法を理解しようとしてきましたが、期待された結果が得られていませんでした。JSONのZipレスポンス(node.js)

私はNodeJS、ExpressJS、LocomotiveJS、Mongoose、MongoDBを使用しています。

私たちはモバイル指向のアプリケーションを開発しているので、可能な限り多くの帯域を節約しようとしています。

モバイルアプリの1日あたりの初回読み込みは、大きなJSONドキュメントになる可能性があるので、デバイスに送信する前にそれを圧縮します。可能であれば、私はディスクI/Oを避けるためにすべてのことをメモリに入れたいと思っています。

私はこれまで3つのライブラリを試してみました:

  • ADM-ジップ
  • ノードジップ
  • zipstream

私はノードジッパーを使用している達成最高の結果。私のコードは次のとおりです。

return Queue.find({'owners': this.param('id')}).select('name extra_info cycle qtype purge purge_time tasks').exec(function (err, docs) { 
    if (!err) { 
     zip.file('queue.json', docs); 
     var data = zip.generate({base64:false,compression:'DEFLATE'}); 

     res.set('Content-Type', 'application/zip'); 
     return res.send(data); 
    } 
    else { 
     console.log(err); 
     return res.send(err); 
    } 
    }); 

結果はダウンロードされたzipファイルですが、内容は判読できません。

私は物事を混同しているとはかなり確信していますが、この時点まで進める方法はわかりません。

アドバイスはありますか? advace

答えて

17

あなたはこれで特急3の出力を圧縮することができますドキュメントから取って完全な例です。

+0

ちょっとありがとう、それは働いた! – AkerbeltZ

+1

簡単だったよ。 – prototype

+0

express.compressミドルウェアはどこに置いてください。経路や静的コンテンツの前か後か? – arunkjn

0

おかげで私はあなたが私がノードでGzipでコンテンツを送信んどのように意味はないでしょうか?

ノードバージョン0.6以上にはzlipモジュールが組み込まれているため、外部モジュールを必要としません。

このようなGzipコンテンツを送信することができます。

response.writeHead(200, { 'content-encoding': 'gzip' }); 
    json.pipe(zlib.createGzip()).pipe(response); 

明らかにあなたは、クライアントがGzipでエンコードを受け入れ、また、あなたが結果をキャッシュする必要がありますのでgzipでは高価な操作であることを覚えている最初のチェック天候にする必要があります。ユーザエージェントは、それが自動的にあなたのためにそれをgzipますgzip圧縮をサポートしている場合

app.configure(function(){ 
    //.... 
    app.use(express.compress()); 
}); 


app.get('/foo', function(req, res, next){ 
    res.send(json_data); 
}); 

はここ

// server example 
// Running a gzip operation on every request is quite expensive. 
// It would be much more efficient to cache the compressed buffer. 
var zlib = require('zlib'); 
var http = require('http'); 
var fs = require('fs'); 
http.createServer(function(request, response) { 
    var raw = fs.createReadStream('index.html'); 
    var acceptEncoding = request.headers['accept-encoding']; 
    if (!acceptEncoding) { 
    acceptEncoding = ''; 
    } 

    // Note: this is not a conformant accept-encoding parser. 
    // See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3 
    if (acceptEncoding.match(/\bdeflate\b/)) { 
    response.writeHead(200, { 'content-encoding': 'deflate' }); 
    raw.pipe(zlib.createDeflate()).pipe(response); 
    } else if (acceptEncoding.match(/\bgzip\b/)) { 
    response.writeHead(200, { 'content-encoding': 'gzip' }); 
    raw.pipe(zlib.createGzip()).pipe(response); 
    } else { 
    response.writeHead(200, {}); 
    raw.pipe(response); 
    } 
}).listen(1337); 
+0

こんにちは、あなたの答えに感謝します。問題は、私たちが使用するモバイルソリューション(Titanium SDK)がgzipファイルをサポートしていないことです。 – AkerbeltZ

1

Express 4+では、compressはExpressにバンドルされておらず、別途インストールする必要があります。その後

$ npm install compression 

ライブラリを使用する:

var compression = require('compression'); 
app.use(compression()); 

をあなたが調整できるオプションの束、see here for the listがあります。