2016-09-27 18 views
1

node.jsのPromisesを使用してローカルシステムのs3バケットからイメージファイルをダウンロードしたいnode.jsのPromiseを使ってs3バケットからイメージをダウンロード

var params = { 
    Bucket: bucket_name', 
    Key: 'key' 
}; 

var fileStream = fs.createWriteStream('path/to/file.jpg'); 

私は

s3.getObject(params).createReadStream.pipe(fileStream); 

作業しかし、私は私のコードをしたいされ、これを試してみました、私はすべての画像がダウンロードされなければならないことを確認するための約束を使用する必要があり、この

return s3.getObject(params).promise() 
    .then(function(data) { 
     //console.log(data.Body); 
     // No idea about this section 
    }) 
    .catch(function(err) { 
     throw err; 
    }); 

のように見えます。このコードは、具体的に動作するかどう

const B = require('bluebird'); 

function downloadFromS3 (object) { 
    var p = B.Promise.defer(); 

    var stream = s3.getObject(params).createReadStream() 

    stream.pipe(fileStream); 

    stream.on('error', (e) => p.reject(e)) 

    stream.on('end',() => p.resolve()) 

    return p.promise; 
} 

downloadFromS3(params) 
    .then(() => console.log('finished')) 
    .catch(() => console.log('failed')) 

わからないが、しかしそれがあなたの方向性を与えることがあります。

+0

任意の約束ライブラリを使用して、約束(ブルーバードのような)にs3コードをラップすることができます。 –

+0

しかし、私はそれを使用してファイルを作成するためにそれをストリームしなければならないと思います –

+0

あなたはストリームを使わずにファイルに保存できます.S3はバイト配列を返すことができますファイル –

答えて

1

一つの可能​​な解決策は、bluebirdを使用して、ストリームの終わりに約束を返す関数を作成することです見てください。

0
streamToPromise = require('stream-to-promise'); 

var fileStream = fs.createWriteStream('path/to/file.jpg'); 
streamToPromise(fileStream).then(function() { 
    console.log('Image saved to file.'); 
}); 
s3.getObject(params).createReadStream.pipe(fileStream); 
+0

に保存してコードを洗い出しますか? –

0

ここでは、読取りストリームと書込みストリームでのエラー検出を含むネイティブの約束の解決策を示します。

function streamPromise(stream) { 
    return new Promise((resolve, reject) => { 
     stream.on('end',() => { 
      resolve('end'); 
     }); 
     stream.on('finish',() => { 
      resolve('finish'); 
     }); 
     stream.on('error', (error) => { 
      reject(error); 
     }); 
    }); 
} 

async function s3Download(srcBucket, srcKey, outputPath) { 
    var objReq = s3.getObject({ 
     Bucket: srcBucket, 
     Key: srcKey 
    }); 
    let outStream = fs.createWriteStream(outputPath); 
    let readStream = objReq.createReadStream(); 
    readStream.on('error', (err) => { 
     console.warn('s3download error', err); 
     outStream.emit("error", err); 
    }); 
    readStream.pipe(outStream); 
    return streamPromise(outStream); 
} 
関連する問題