2016-06-30 4 views
2

Ich versuche, eine recht einfache Aufgabe zu erledigen, aber ich bin ein wenig verwirrt und habe mich in nodejs mit zlib festgefahren. Ich baue Funktionalität, die mich einschließt, die Datei von aws S3 herunter zu laden, die gziped ist, es entzippend und es Zeile für Zeile lesend. Ich möchte all das mit Streams erreichen, da ich glaube, dass dies in nodejs möglich ist.Wie zum Gunzip Stream in Nodejs?

Hier ist meine aktuelle Code-Basis:

//downloading zipped file from aws s3: 
//params are configured correctly to access my aws s3 bucket and file 

s3.getObject(params, function(err, data) { 
    if (err) { 
    console.log(err); 
    } else { 

    //trying to unzip received stream: 
    //data.Body is a buffer from s3 
    zlib.gunzip(data.Body, function(err, unzippedStream) { 
     if (err) { 
     console.log(err); 
     } else { 

     //reading line by line unzziped stream: 
     var lineReader = readline.createInterface({ 
      input: unzippedStream 
     }); 
     lineReader.on('line', function(lines) { 
      console.log(lines); 
     }); 
     } 
    }); 
    } 
}); 

ich einen Fehler zu sagen:

readline.js:113 

     input.on('data', ondata); 
      ^

    TypeError: input.on is not a function 

Ich glaube, ein Problem in unzipping Prozess sein könnte, aber ich bin nicht sicher, was ist falsch, jede Hilfe wäre willkommen.

Antwort

2

Ich habe kein S3-Konto mit zu testen, aber reading the docs schlägt vor, dass s3.getObject() einen Strom zurückkehren kann, wobei in diesem Fall denke ich, dass dies funktionieren könnte:

var lineReader = readline.createInterface({ 
    input: s3.getObject(params).pipe(zlib.createGunzip()) 
}); 
lineReader.on('line', function(lines) { 
    console.log(lines); 
}); 

EDIT: sieht aus wie die API kann sich geändert haben, und Sie sind jetzt erforderlich, um instantiate a stream object manually, bevor Sie können über die Pipeline es durch etwas anderes:

s3.getObject(params).createReadStream().pipe(...) 
+2

Das in der Tat arbeitete .. alles in einer Zeile statt 3 Funktionen hatte ich .. alles, was ich tun musste, war hinzufügen .crea teReadStream() wie in 's3.getObject (params) .createReadStream(). pipe (zlib.createGunzip())' und es hat perfekt funktioniert. Jetzt muss ich nur eine Fehlerbehandlung einbeziehen, DANKE SIR! – Tomas

+0

das funktioniert nicht: 'TypeError: s3.getObject (...). Pipe ist keine Funktion' – loretoparisi

+1

@loretoparisi Ich denke, die API hat sich geändert, versuchen' s3.getObject (...). CreateReadStream(). Pipe() ' – robertklep