2011-06-30 13 views
2

私は具体的にNode.jsの...のNode.js - スポーンのgzipプロセス

を使用していくつかのデータをgzip圧縮しようとしている、私は「BUF」にデータを持っていると私は 'にこれをgzipで圧縮された形を書きたいですストリーム'。

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

2つのことを試してみることができます:stdout.on( 'data')何かが起きた場合にstdinに書き込む前に、また、キャッチしていないというエラーメッセージがある場合はstderrでリッスンしてください。 – StevenGilligan

+0

はい、それは私が今やっていることです。あなたの助けてくれてありがとう – Eamorr

答えて

1

あなたはgzip.stdinに '終了' メソッドを呼び出す必要がありますか?すなわち:

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にはunzipがありません。(induntyのコードに基づく)unzipモジュールを作成しました。まだいくつかのbufを取得していますエラー。 – Eamorr

関連する問題