Compresión y descompresión de datos usando zlib en Nodejs

¿Puede alguien explicarme cómo funciona la biblioteca zlib en Nodejs?

Soy bastante nuevo en Nodejs, y todavía no estoy seguro de cómo usar buffers y streams.

Mi escenario simple es una variable de cadena, y quiero comprimir o descomprimir (desinflar o inflar, gzip o gunzip, etc.) la cadena a otra cadena.

Es decir (como esperaría que funcione)

var zlib = require('zlib'); var str = "this is a test string to be zipped"; var zip = zlib.Deflate(str); // zip = [object Object] var packed = zip.toString([encoding?]); // packed = "packedstringdata" var unzipped = zlib.Inflate(packed); // unzipped = [object Object] var newstr = unzipped.toString([again - encoding?]); // newstr = "this is a test string to be zipped"; 

Gracias por las ayudas 🙂

Actualización : No me di cuenta de que había un nuevo módulo ‘zlib’ incorporado en el nodo 0.5. Mi respuesta a continuación es para el módulo node-zlib de terceros. Se actualizará la respuesta para la versión incorporada momentáneamente.

Actualización 2 : Parece que puede haber un problema con el ‘zlib’ incorporado. El código de muestra en los documentos no funciona para mí. El archivo resultante no es gunzip’able (falla con “final de archivo inesperado” para mí). Además, la API de ese módulo no es particularmente adecuada para lo que estás tratando de hacer. Es más para trabajar con flujos en lugar de buffers, mientras que el módulo node-zlib tiene una API más simple que es más fácil de usar para los buffers.


Un ejemplo de desinflado e inflado, usando un módulo de nodo-zlib de terceros:

 $ node > // Load zlib and create a buffer to compress > var zlib = require('zlib'); > var input = new Buffer('lorem ipsum dolor sit amet', 'utf8') > // What's 'input'? > input  > // Compress it > zlib.deflate(input)  > // Compress it and convert to utf8 string, just for the heck of it > zlib.deflate(input).toString('utf8') 'x???/J?U?,(.?UH???/R(?,QH?M-\u0001\u0000?\u0015\t?' > // Compress, then uncompress (get back what we started with) > zlib.inflate(zlib.deflate(input))  > // Again, and convert back to our initial string > zlib.inflate(zlib.deflate(input)).toString('utf8') 'lorem ipsum dolor sit amet' 

Para cualquiera que se tropiece con esto en 2016 (y también se pregunta cómo serializar datos comprimidos en una cadena en lugar de un archivo o un búfer), parece que zlib (desde el nodo 0.11) ahora ofrece versiones síncronas de sus funciones que no requieren devoluciones de llamada:

 var zlib = require('zlib'); var input = "Hellow world"; var deflated = zlib.deflateSync(input).toString('base64'); var inflated = zlib.inflateSync(new Buffer(deflated, 'base64')).toString(); console.log(inflated); 

La respuesta de Broofa es genial, y así es exactamente como me gustaría que las cosas funcionen. Para mi nodo insistió en las devoluciones de llamada. Esto terminó pareciendo:

 var zlib = require('zlib'); var input = new Buffer('lorem ipsum dolor sit amet', 'utf8') zlib.deflate(input, function(err, buf) { console.log("in the deflate callback:", buf); zlib.inflate(buf, function(err, buf) { console.log("in the inflate callback:", buf); console.log("to string:", buf.toString("utf8") ); }); }); 

lo que da:

 in the deflate callback:  in the inflate callback:  to string: lorem ipsum dolor sit amet