javascript - S3 在 Promise 中下载到 FileStream?
问题描述
我正在尝试这样做:
function getObjectStream(keyFile) {
return new Promise(function(success, reject) {
let stream = s3.getObject({ Bucket: aws_exports.imageBucket, Key: keyFile })
.createReadStream()
.on('end', function () {
console.log("sucesfully downloaded");
success(stream);
}).on('error', function(err) {
console.log(err);
reject(error);
});
});
}
这基本上是从 S3 下载一个对象,将其转换为读取流,然后在创建该读取流时返回成功或失败。
问题是.on('end', function ()
在成功创建流时并没有真正调用它。活动也没有“开放”。
我如何在 promise 中实现这种逻辑?
解决方案
你在这里做错的是.on('end', function ())
而不是.on('close', function ())
.
但为什么还要这样做呢?aws-sdk
提供了一个.promise()
,你可以简单地做
s3.getObject(params).promise().then(...).catch(...)
或使用异步/等待。
假设您只需要在流中使用它,请尝试以下操作:
function getObjectAndWriteToFile(keyFile) {
return new Promise(function(success, reject) {
const destPath = `/tmp/${path.basename(key)}`
s3.getObject({ Bucket: aws_exports.imageBucket, Key: keyFile })
.createReadStream()
.pipe(fs.createWriteStream(destPath))
.on('close', function () {
console.log("sucesfully downloaded");
resolve(destPath)
})
.on('error', function(err) {
console.log(err);
reject(error);
});
});
}
我建议阅读这个线程。
推荐阅读
- javascript - 如何使用按钮来操作值
- ios - 如何阻止 UITableview 一次滚动多个单元格
- javascript - 我的复选框星级评分不起作用
- java - 如何显示 5 个不同的签名和 5 个图像视图,这些图像视图之前已使用查看按钮保存到图库?
- python - Python 抓取隐藏数据
- r - 在 x 轴上带有观察值的分组条形图
- javascript - 如何让一个 HTML 元素忽略另一个元素的位置?
- python - 操作列表顺序
- android - Android Studio Profiler Network 未显示接收发送行,但显示连接和详细信息
- r - 变异方法不适用于 R 中的日期列