2012-04-01 94 views
4

對不起模糊的問題..但我不確定問題是什麼。 我有一個節點http服務器,用於將JSON數據提供給Web應用程序。它工作的很好,但我的JSON字符串開始變大(10-12 MB),所以我想用zlib添加壓縮。Node.JS http服務器壓縮 - 發送變量作爲迴應

JSON數據位於字符串變量中,我想壓縮然後寫入響應對象...但返回客戶端的結果似乎始終具有完美的標頭,並且沒有內容。這裏是我的deliverResponse功能:

var deliverResult = function (data, response, callback, acceptEncoding){ 
    var payload = callback + '(' + JSON.stringify(data) + ');'; 

    if (acceptEncoding.match(/\bdeflate\b/)) { 
     response.writeHead(200, { 'Content-Encoding': 'deflate', 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     zlib.deflate(payload, function(err, result){ 
      if(!err){ 
       //console.log(result.toString('utf8')); // I have data on the console here 
       response.write(result.toString('utf8')); // No data sent here 
      } 
     }); 
    } else if (acceptEncoding.match(/\bgzip\b/)) { 
     response.writeHead(200, { 'Content-Encoding': 'gzip', 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     zlib.gzip(payload, function(err, result){ 
      if(!err){ 
       response.write(result.toString('utf8')); 
      } 
     }); 
    } else { 
     writelog('INFO', 'Returning data without compression\n'); 
     response.writeHead(200, { 'Content-Type': 'text/javascript; charset=UTF-8' }); 
     response.write(payload); 
    } 

    response.end(); 
} 

的與zlib的使用流和管功能HTTP服務器的例子,但我不發送文件,因爲我在生成從數據庫應用程序中的JSON數據,所以我基於便利方法的例子。到目前爲止我的故障排除我知道響應對象是好的,並且result.toString('utf8')按預期輸出gobeldy-gook。如果我不向服務器發送acccept-encoding頭文件,它會完美地發送純文本 - 所以它必須是壓縮函數。

任何人有任何想法嗎?我非常肯定,我對流,管道,緩衝區和zlib對象缺乏瞭解,這可能只是一個語法問題,所以希望有人瞭解所有這些可以幫助我:)

乾杯

+0

我假定JSON是用於下載的,否則它可能會阻塞瀏覽器:) – 2012-04-02 03:21:35

+0

不,它是實時地圖應用程序的位置數據。大多數瀏覽器都沒有問題。 – whiteatom 2012-05-30 12:33:41

回答

2

解決....

愚蠢的問題..該回復於被調用的異步函數,所以它做的Response.Write和一個空的響應之前write.end()發送...在回調中將response.write替換爲response.end並且它完美地工作:)