2011-06-30 8 views
2

Je suis en train de gzip des données en utilisant Node.js ...Node.js - spawn processus gzip

Plus précisément, j'ai données 'BUF et je veux écrire une forme gzip de ce à' courant'.

Voici mon code:

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'); 
       }); 
}); 

Le problème est, il ne fonctionnera pas! Je ne suis pas sûr de la syntaxe exacte des processus de génération et des données de tuyauterie.

Toute aide grandement appréciée.

Un grand merci à l'avance,

Edit: voici le code de travail d'origine où j'ai eu l'idée de. Le projet est à: https://github.com/indutny/node.gzip

Quelqu'un peut-il travailler sur comment faire ce frai dans node.js parce que je suis totalement coincé!


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

Vous pouvez essayer deux choses: définir le fichier stdout.on ('data' AVANT d'écrire sur le fichier stdin, au cas où quelque chose apparaîtrait et aussi, écouter sur le stderr au cas où un message d'erreur ne s'affiche pas. – StevenGilligan

+0

Oui, c'est quelque chose que je fais en ce moment .. Merci pour votre aide, – Eamorr

Répondre

1

Avez-vous besoin d'appeler la méthode 'end' sur gzip.stdin? I.e .:

+0

C'est certainement quelque chose que je n'ai pas fait Quand j'appelle stdin.end() je reçois des données qui se déplacent Le problème est, j'ai maintenant une autre erreur qui apparaît: "Erreur: décalage est hors limites" Ps J'ai édité mon OP pour fournir plus d'informations.Merci – Eamorr

2

Pourquoi n'utilisez-vous pas simplement la bibliothèque de nœuds gzip dont vous êtes "inspiré" au lieu de copier le code?

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

Doit fonctionner en utilisant la bibliothèque. Pour l'installer, tapez simplement npm install gzip dans votre terminal.

+0

Je sais.Mais c'est bug (IMO) - Je continue à obtenir des erreurs de mémoire tampon.J'essaie de reconstruire node.gzip n'a pas de décompression, j'ai créé un module de décompression (basé sur le code d'indunty) pour le noeud qui fonctionne bien, mais je Je reçois encore du buf erreurs de fer. – Eamorr

Questions connexes