7

node.jsは初めてで、JSONの結果を含むzipファイルを返送しようとしています。私はそれを行う方法を理解しようとしてきましたが、期待した結果が得られていません。

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

モバイル指向のアプリケーションを構築しているので、できるだけ多くの帯域幅を節約しようとしています。

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

これまでに3つのライブラリで試しました。

  • adm-zip
  • node-zip
  • zipstream

私が達成した最良の結果は、node-zipを使用することです。これが私のコードです:

  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ファイルですが、内容は読み取れません。

私は物事を混乱させているとかなり確信していますが、この時点まで私はどのように進めるかがわかりません。

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

前進してくれてありがとう

4

3 に答える 3

18

これを使用して、Express3の出力を圧縮できます。

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


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

ユーザーエージェントがgzipをサポートしている場合は、自動的にgzipで圧縮されます。

于 2012-09-25T23:15:59.157 に答える
5

Express 4以降の場合、compressはExpressにバンドルされていないため、個別にインストールする必要があります。

$ npm install compression

次に、ライブラリを使用するには:

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

調整できるオプションはたくさんあります。リストについては、こちらをご覧ください

于 2017-04-26T14:42:05.880 に答える
1

ノードでGzipコンテンツを送信するにはどうすればよいですか?

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

このようにGzipコンテンツを送信できます。

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

明らかに、最初にクライアントがGzipエンコーディングを受け入れる天気を確認する必要があります。また、gzipはコストのかかる操作であるため、結果をキャッシュする必要があります。

これがドキュメントからの完全な例です

// 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);
于 2012-09-25T22:30:27.463 に答える