2017-06-30 5 views
0

Ich habe eine Funktion auf meinem Nodejs Server, der eine CSV-Datei von einem Link herunterlädt, und dann, wenn es heruntergeladen wird, führt es die Parsing-Funktion.Seltsames Ergebnis beim Herunterladen eines csv über writeStream

Die URL ist aus folgendem Format:

http://myprovider/grails/mgmt/downloadFile.dispatch?uid=12345&username=Lucas&password=Password

function getItemCSVsingle(ItemLinkObject) { 

    var ItemName=ItemLinkObject.nameLabel; 
    var ItemURL=ItemLinkObject.url; 

    var writeStream = fs.createWriteStream(ItemDownloadPath.concat(ItemName).concat('.csv')); 
    writeStream.on('finish', function() {   
     loadItemCSV(ItemName); 
    }) 
    request({ 
     method: 'GET', 
     uri: ItemURL, 
    }).pipe(writeStream) 
} 

Aber dann unsere Datenanbieter geschaltet Links, die Basis-Authentifizierung erfordern.

Also die neue Funktion sieht so aus - und die URL, die ich konstruiere funktioniert ohne Probleme, wenn ich es kopiere und in Chrome einfügen, so ist es gültig. Mit Arbeiten meine ich es führt zu einem CSV-Datei-Download.

function getItemCSVwithAuth(ItemLinkObject) { 

    var ItemName=ItemLinkObject.nameLabel; 
    var ItemURL='https://'+username+':'password+'@'+ItemLinkObject.url; 

    var writeStream = fs.createWriteStream(ItemDownloadPath.concat(ItemName).concat('.csv')); 
    writeStream.on('finish', function() {  
     loadItemCSV(ItemName); 
    }) 
    request({ 
     method: 'GET', 
     uri: ItemURL,  
    }).pipe(writeStream) 
} 

Das Problem ist, dass, wenn ich diese Anforderung auf meinem Knoten-Server ausführen, die resultierende CSV-Datei sehr seltsam ist, nur 440 Bytes (statt der erwarteten 2 KB), und wenn ich es in erhabener öffnen sieht es wie folgt aus:

1f8b 0800 0000 0000 0400 a594 dd6a dc30 
1085 ef0b 7d07 3f80 6035 3fd2 48bd dba4 
49ae 5296 26f4 dec4 4a10 ac63 70ec bc5c 
2ffa 487d 858e b7a1 6c31 1595 8397 99c5  
307a f1a5 1608 0000 
+0

Ich würde versuchen, Postbote, um zu bestimmen, die Ursache des Problems:

Um Dekompression in request, aktivieren Sie die gzip Option zu aktivieren. – Lazyexpert

+0

Oder Sie können nur die Pipe entfernen und normalen Callback hinzufügen, um zu sehen, wie Inhalte empfangen werden. – Lazyexpert

+0

'1f8b' (erste zwei Bytes) zeigen an, dass die Daten gzip-komprimiert sind, versuchen Sie' gzip: true' in den Optionen an 'request' zu setzen – robertklep

Antwort

1

die ersten beiden Bytes der Antwort, 1f8b, zeigen an, dass die Antwort gzip-komprimiert ist (der für HTTP-Antworten gemeinsam ist, obwohl in der Regel, ein Client den Server spezifisch ist zu sagen, dass es eine solche Kompression unterstützt, was ich glaube nicht request tut).

request({ 
    method : 'GET', 
    uri : ItemURL, 
    gzip : true, 
}).pipe(writeStream) 
Verwandte Themen