2014-09-12 12 views

risposta

12

Non so se è possibile controllare in anticipo il tipo di dati. Campo di dati fornito nel callback getObject(). Se tutto quello che vuoi fare è determinare se hai ricevuto un buffer, puoi provare il metodo di classe Node's Buffer.isBuffer (data.body).

In alternativa, si potrebbe desiderare di evitare il problema del tutto e utilizzare questo approccio da S3 documentation di Amazon:

var s3 = new AWS.S3(); 
var params = {Bucket: 'myBucket', Key: 'myImageFile.jpg'}; 
var file = require('fs').createWriteStream('/path/to/file.jpg'); 
s3.getObject(params).createReadStream().pipe(file); 

Presumendo che verrà usato questo codice in un ambiente tipico node.js asincrona richiamata, potrebbe avere più senso per vedere il codice in questo modo:

var fs = require('fs'); 

function downloadFile(key, localPath, callback) { 
    var s3 = new AWS.S3(); 
    var params = {Bucket: 'myBucket', Key: key}; 
    var file = fs.createWriteStream(localPath); 

    file.on('close') { 
    callback(); 
    } 

    file.on('error', function(err) { 
    callback(err); 
    }); 

    s3.getObject(params).createReadStream().pipe(file); 
} 
+1

Se il codice di cui sopra non riesce a scaricare, come si intercetta l'errore? – Mike

+1

@Mike: prima o dopo il gestore 'close', aggiungi qualcosa come: file.on ('error', function (err) {callback (err);}); – Bruce

+0

Grazie! Grazie! Grazie! – Mike

3

non riuscivo a trovare un modo per cambiare il tipo di corpo o, comunque dopo aver notato il corpo è stato un buffer, ho trasformato il buffer in un ReadableStream con questo pratico & bella semplice function: AWS.util.buffer.toStream (o forse potresti voler usare un'altra lib come streamifier).

Stavo cercando qualcosa su cui poter convalidare gli errori prima di fare qualsiasi altra cosa, nell'esempio di Amazon si traduce in "creare il flusso di scrittura solo se non ci fossero errori".

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

    var file = require('fs').createWriteStream(name); 
    var read = AWS.util.buffer.toStream(data.Body); 

    read.pipe(file); 
    read.on('data', function(chunk) { 
     console.log('got %d bytes of data', chunk.length); 
    }); 
}); 
Problemi correlati