2013-02-22 55 views
2

只見示例所示hereNode.js的放氣/ gzip的響應文本

response.writeHead(200, { 'content-encoding': 'deflate' }); 
raw.pipe(zlib.createDeflate()).pipe(response); 

我試圖通過創建一個讀操作流和發送放氣輸出發送響應。

但我正在尋找一種方法來做到不讀流,因爲我有來自另一個HTTP請求的文本。我只是用response.write(text);

我試了幾件事情,包括

zlib.deflate(text, function (err, buffer) { 
    if (err) throw err; 
    response.write(buffer); 
    response.end(); 
}); 

但瀏覽器說:invalid or unsupported form of compression.

我在做什麼錯?

connect的代碼表示

return stream 
    ? stream.write(new Buffer(chunk, encoding)) 
    : write.call(res, chunk, encoding); 

因此,它是隻喜歡流將被處理?

回答

2

您使用的是Express嗎?如果是這樣,只需使用compress中間件:

app.use(express.compress()); 

http://expressjs.com/api.html#compress

+0

不,我正在使用'connect',並嘗試壓縮''路由器'功能。任何其他想法? – 2013-02-22 08:45:34

+0

'connect.compress()'? – robertklep 2013-02-22 08:58:38

+0

使用'connect.compress'我有同樣的問題,他正面臨http://stackoverflow.com/questions/13163393/my-returned-data-is-not-gzipped-with-connect-compress – 2013-02-22 09:21:58

0

所以,我設法解決這個問題。這裏是代碼

var zlib = require('zlib'); 
var connect = require('connect'); 
var fs = require('fs'); 

var server = connect() 
    // .use(connect.compress()) It didn't work either 
    .use(function (req, res, next) { 
     var text = fs.readFileSync('test.js'); 

     zlib.deflate(text, function (err, buffer) { 
      if (err) throw err; 

      res.writeHead(200, { 
       'Content-Encoding': 'deflate', 
       'Content-Type': 'text/javascript' 
      }); 

      res.end(buffer); 
     }); 
    }) 
    .listen(1337); 

我不知道我以前做了什麼錯誤導致它不工作。我不確定是否有版本衝突導致問題或其他問題。但最後,上面的代碼適用於我;)

+0

這是一個可怕的解決方案,因爲您正在將整個文件存儲在內存中 – 2013-03-21 00:55:33

+0

嗯,我知道並且只是爲了一些測試目的而做它。但是,如果您有要求您發佈更好的解決方案,那麼其他人可以從最佳實踐中受益。謝謝。 – 2013-03-21 04:25:56

+0

'res.writeHead(); fs.createFileStream(file).pipe(zlib.createGzip())。pipe(res));' – 2013-03-21 04:46:26