使用node.js中的Promise从s3桶下载图像

我想使用node.js中的Promises从本地系统的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; }); 

我必须使用Promise来确保应该下载所有的图片。

一个可能的解决scheme是使用bluebird并创build一个函数,在stream的末尾返回一个promise:

 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')) 

不知道这个代码是否可以工作,但它可能会给你一个方向来看看。

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

这是一个原生的承诺解决scheme,在读取stream和写入stream上进行错误检测。

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