Estoy descargando este objeto AWS S3 en mi servidor local Node.js
con esto:
var url = "http://s3.amazonaws.com/cloudfront.s3post.cf/s3posts.json.gz"; var dest = "./s3posts.json.gz"; var download = function(url, dest, cb) { var file = fs.createWriteStream(dest); var request = http.get(url, function(response) { response.pipe(file); file.on('finish', function() { file.close(cb); }); }); } download(url, dest, function() { console.log('Download complete'); });
Esto descarga con éxito un objeto .json.gz
. Estoy tratando de descomprimir este objeto usando zlib
-
var gunzip = zlib.createGunzip(); var rstream = fs.createReadStream('./s3posts.json.gz'); var wstream = fs.createWriteStream('./s3posts.json'); rstream.pipe(gunzip).pipe(wstream);
Sin embargo, esto arroja un error y el archivo .json
que se crea está vacío:
events.js:163 throw er; // Unhandled 'error' event ^ Error: unexpected end of file at Zlib._handle.onerror (zlib.js:355:17)
Extrañamente, si uso solo el código de descarga para descargar el objeto y lo descomprimo manualmente usando gunzip s3posts.json.gz
en la terminal, el archivo json creado está lleno de contenido y puedo ejecutar mi aplicación correctamente.
No estoy seguro de por qué puedo descomprimir manualmente pero no puedo hacerlo mediante programación con zlib
. Sería muy útil si alguien puede señalar si estoy cometiendo un error.
El objeto S3 tiene los siguientes metadatos si es relevante:
Cache-Control: max-age=31536000,no-transform,public Content-Encoding: gzip Content-Type: application/json
Lo que sucedió es que no verifica si hay errores cuando descarga el archivo comprimido con gzip, por lo que termina guardando un archivo vacío. Luego intenta descomprimir el archivo vacío y obtiene un error, que tampoco se maneja y su programa falla.
Simplemente maneje todos los errores y sabrá lo que salió mal. De su ejemplo, es imposible decirle nada más que el archivo .gz probablemente esté vacío porque aparentemente algo salió mal con la descarga. Pero querer exactamente salió mal es un misterio porque no verifica si hay errores en su código.
Resulta que no estaba esperando a que el archivo terminara de descargarse antes de descomprimirlo; por eso el json
generado estaba vacío. Tuve que usar el código para descomprimir el archivo como una función de devolución de llamada:
download(url, dest, function() { console.log('Download complete'); var gunzip = zlib.createGunzip(); var rstream = fs.createReadStream('./s3posts.json.gz'); var wstream = fs.createWriteStream('./s3posts.json'); rstream.pipe(gunzip).pipe(wstream); });
Esto también explica por qué pude descomprimir el archivo manualmente solo usando el código de descarga, ya que la descarga se completó en ese momento, lo que me permitió descomprimirlo con éxito en la terminal.