2015-06-17 11 views
7

Come utilizzare request per scaricare il contenuto di un file e inviarlo direttamente a s3 utilizzando aws-sdk per il nodo?risposta di flusso dalla richiesta nodejs a s3

Il codice qui sotto mi dà Object #<Request> has no method 'read' che fa sembrare come richiesta non restituisce un flusso leggibile ...

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 le aws-sdk docsBody deve essere un oggetto ReadableStream.

Cosa sto facendo di sbagliato qui?

Questo può essere estratto utilizzando il modulo s3-upload-stream, tuttavia preferirei limitare le mie dipendenze.

+0

Dove/come si 'req' definiti? – mscdex

+0

@mscdex domanda aggiornata per rispecchiare il req – rynop

risposta

6

si desidera utilizzare l'oggetto response se si sta ascoltando manualmente per il flusso di risposta:

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

grazie! Per gli altri, il modo documentato per ottenere il flusso è un po 'ingannevole https://github.com/request/request/issues/931 – rynop

+7

Sto avendo lo stesso problema - questa risposta è utile ma il file su s3 finisce essendo zero byte. Piping della stessa richiesta su disco produce un file valido. –

+1

@JoshSantangelo se stai ancora avendo quel problema, forse dai un'occhiata alla mia soluzione alternativa. – d0gb3r7

10

Da quando ho avuto lo stesso problema di @JoshSantangelo (a zero byte file su S3) con [email protected] 0 e [email protected], permettetemi di aggiungere una soluzione alternativa utilizzando proprio modulo http del Nodo (avvertimento: semplificata codice da un vero e proprio progetto di vita e non testato separatamente):

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); 
    }); 
} 

per quanto posso dire , il problema è che request non supporta completamente l'API corrente dei flussi di nodi, mentre aws-sdk dipende da questo.

Riferimenti:

+3

Questa era l'unica soluzione che funzionava per me. Grazie. – Baldur

+0

Questo ha funzionato, ma ho dovuto utilizzare https anziché http – Chet

+0

Un semplice switch per https: var http = require ('http'); var https = require ('https'); if (url.toString(). IndexOf ("https") === 0) { http = https; } – Andrew

Problemi correlati