2011-06-30 93 views
2

我想了解如何使用Node.js給gzip一些數據...的Node.js - 產卵gzip的過程

具體來說,我在「BUF」的數據,我想要寫的這一個壓縮的形式「流'。

這裏是我的代碼:

c1.on('data',function(buf){ 
       var gzip = spawn('gzip', ['-' + (compressionRate-0),'-c', '-']); 

       gzip.stdin.write(buf); 
       gzip.stdout.on('data',function(data){ 
         console.log(data); 
         stream.write(data,'binary'); 
       }); 
}); 

麻煩的是,它根本行不通!我不確定產卵過程和管道數據的確切語法。

任何幫助非常感謝。

很多感謝,

編輯:這裏是我得到的想法從原來的工作代碼。該項目是在:https://github.com/indutny/node.gzip

任何人都可以搞清楚如何做到這一點在node.js產卵因爲我完全卡住!


var spawn = require('child_process').spawn, 
    Buffer = require('buffer').Buffer; 

module.exports = function (data) { 
    var rate = 8, 
     enc = 'utf8', 
     isBuffer = Buffer.isBuffer(data), 
     args = Array.prototype.slice.call(arguments, 1), 
     callback; 

    if (!isBuffer && typeof args[0] === 'string') { 
     enc = args.shift(); 
    } 
    if (typeof args[0] === 'number') { 
     rate = args.shift() - 0; 
    } 
    callback = args[0]; 

    var gzip = spawn('gzip', ['-' + (rate - 0), '-c', '-']); 

    var promise = new 
    process.EventEmitter, 
     output = [], 
     output_len = 0; 

    // No need to use buffer if no 
    callback was provided 
    if (callback) { 
     gzip.stdout.on('data', function (data) { 
      output.push(data); 
      output_len += data.length; 
     }); 

     gzip.on('exit', function (code) { 
      var buf = new Buffer(output_len); 

      for (var a = 0, p = 0; p < output_len; p += output[a++].length) { 
       output[a].copy(buf, p, 0); 
      } 
      callback(code, buf); 
     }); 
    } 
    // Promise events 
    gzip.stdout.on('data', function (data) { 
     promise.emit('data', data); 
    }); 
    gzip.on('exit', function (code) { 
     promise.emit('end'); 
    }); 

    if (isBuffer) { 
     gzip.stdin.encoding = 'binary'; 
     gzip.stdin.end(data.length ? data : ''); 
    } else { 
     gzip.stdin.end(data ? data.toString() : '', enc); 
    } 

    // Return EventEmitter, so node.gzip can be used for streaming 
    // (thx @indexzero for that tip) 
    return promise; 
}; 
+0

您可以嘗試兩件事:設置stdout.on('data'在寫入標準輸入前,萬一出現任何錯誤,並且在錯誤信息中沒有捕獲的情況下偵聽stderr。 – StevenGilligan

+0

是的,這是我現在正在做的事情。感謝您的幫助, – Eamorr

回答

1

你需要調用gzip.stdin的 '結束' 的方法? I .: .:

gzip.stdin.write(buf); 
gzip.stdout.on('data',function(data){ 
     console.log(data); 
     stream.write(data,'binary'); 
}); 
gzip.stdin.end();   
+0

這當然是我沒有做的事情當我打電話給stdin.end()時,我得到了一些數據移動!麻煩是,我現在有另一個錯誤出現:「錯誤:偏移超出範圍」Ps我編輯了我的OP以提供更多信息,非常感謝 – Eamorr

2

爲什麼不簡單地使用gzip節點庫,你是從「啓發」而不是複製代碼?

var gzip = require('gzip'); 
c1.on('data' function(buf){ 
    gzip(buf, function(err, data){ 
     stream.write(data, 'binary'); 
    } 
} 

應該使用庫。要安裝它,只需在終端中輸入npm install gzip即可。

+0

我知道,但它是(IMO)錯誤 - 我不斷收到緩衝區錯誤,我試圖重建它從spawn命令開始,所以我可以弄清楚什麼是錯誤的。此外,node.gzip沒有解壓。我創建了一個解壓縮模塊(基於indunty的代碼)爲節點工作正常,但我我仍然得到一些buf錯誤。 – Eamorr