2013-10-25 5 views
13

Mit dem nativen http.get() in Node.js versuche ich, eine HTTP-Antwort an einen Stream zu leiten, den ich an data und end Ereignisse binden kann.Node.js HTTP-Antwortstreams

Ich bin Umgang mit dieser derzeit für gzip Daten, mit:

http.get(url, function(res) { 
    if (res.headers['content-encoding'] == 'gzip') { 
    res.pipe(gunzip); 
    gunzip.on('data', dataCallback); 
    gunzip.on('end', endCallback); 
    } 
}); 

Gunzip ist ein Strom, und dies funktioniert einfach. Ich habe versucht, Streams zu erstellen (Streams zu schreiben, dann Streams zu lesen) und die Antwort zu pipen, hatte aber nicht viel Glück. Irgendwelche Vorschläge, um denselben Deal zu replizieren, für nicht gezippten Inhalt?

+0

Ich versuche, den Antworttext zu erhalten, sobald er fertig ist. Ich dachte, ich könnte 'res.on ('data') 'machen, aber das scheint nie auszulösen. – dzm

Antwort

20

Das Antwortobjekt einer HTTP-Anfrage ist eine Instanz eines lesbaren Streams. Daher würden Sie die Daten mit dem Ereignis data sammeln und dann verwenden, wenn das Ereignis end ausgelöst wird.

var http = require('http'); 
var body = ''; 

http.get(url, function(res) { 
    res.on('data', function(chunk) { 
    body += chunk; 
    }); 
    res.on('end', function() { 
    // all data has been downloaded 
    }); 
}); 

Die readable.pipe(dest) tun würde im Grunde das Gleiche, wenn body in dem obigen Beispiel ein beschreibbarer Strom sind.

+1

Doh, naja, es stellte sich heraus, dass http nicht auf Redirects folgte. Ihr Code ist was ich habe und es funktioniert gut, mit Ausnahme von Weiterleitungen. Ich habe npm 'follow-redirects' überprüft und werde es ausprobieren. – dzm

+0

Sie können auch versuchen, beliebte 'request' Modul, das auch Weiterleitungen folgt – vkurchatkin

+0

@vkurchakin' Anfrage' unterstützt unterstützt gziped Inhalt – dzm