2015-06-17 8 views
7

Wie benutzt man request, um den Inhalt einer Datei herunterzuladen und direkt auf s3 zu streamen mit dem aws-sdk für Knoten?stream response von nodejs anfrage an s3

Der folgende Code gibt mir Object #<Request> has no method 'read', die es wie Anfrage keinen lesbaren Stream zurückzukehren ...

var req = require('request'); 
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}}); 
var imageStream = req.get(url) 
    .on('response', function (response) { 
     if (200 == response.statusCode) { 
     //imageStream should be read()able by now right? 
     s3.upload({Body: imageStream, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months 
      console.log(err,data); 
     }); 
     } 
    }); 
}); 

Per den aws-sdk docsBody Bedürfnisse scheint macht ein ReadableStream Objekt sein.

Was mache ich hier falsch?

Dies kann mit dem Modul s3-upload-stream abgezogen werden, jedoch würde ich lieber meine Abhängigkeiten begrenzen.

+0

Wo/wie ist 'req' definiert? – mscdex

+0

@mscdex Frage aktualisiert, um req – rynop

Antwort

6

Sie wollen das response Objekt verwenden, wenn Sie manuell für den Antwortstream hören:

var req = require('request'); 
var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}}); 
var imageStream = req.get(url) 
    .on('response', function (response) { 
     if (200 == response.statusCode) { 
     s3.upload({Body: response, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months 
      console.log(err,data); 
     }); 
     } 
    }); 
}); 
+0

Dank zu reflektieren! Für andere Refrence, Request's dokumentierte Art und Weise des Streams ist ein bisschen irreführend https://github.com/request/request/issues/931 – rynop

+7

Ich habe das gleiche Problem - diese Antwort ist hilfreich, aber die Datei auf s3 landet Null Bytes. Wenn Sie die gleiche Anforderung auf die Festplatte übertragen, wird eine gültige Datei erstellt. –

+1

@JoshSantangelo Wenn Sie dieses Problem immer noch haben, sehen Sie sich vielleicht meine alternative Lösung an. – d0gb3r7

10

Da ich das gleiche Problem wie @JoshSantangelo (Null-Byte-Dateien auf S3) mit [email protected] hatte. (: vereinfachte Code aus einem realen Projekt und nicht separat getestet Vorbehalt): unter Verwendung von Node eigenen http Modul 0 und [email protected].1.43, lassen Sie mir eine alternative Lösung hinzufügen

var http = require('http'); 

function copyToS3(url, key, callback) { 
    http.get(url, function onResponse(res) { 
     if (res.statusCode >= 300) { 
      return callback(new Error('error ' + res.statusCode + ' retrieving ' + url)); 
     } 
     s3.upload({Key: key, Body: res}, callback); 
    }) 
    .on('error', function onError(err) { 
     return callback(err); 
    }); 
} 

Soweit ich sagen kann, Das Problem ist, dass request unterstützt die aktuelle Node-Stream-API nicht vollständig, während aws-sdk davon abhängt.

Referenzen:

+3

Dies war die einzige Lösung, die für mich funktionierte. Vielen Dank. – Baldur

+0

Das funktionierte - aber ich musste https anstelle von http verwenden – Chet

+0

Ein einfacher Schalter für https: var http = erfordern ('http'); var https = require ('https'); if (url.toString(). IndexOf ("https") === 0) { http = https; } – Andrew