S3 下载到 Promise 中的 FileStream?
S3 Download to FileStream in Promise?
我正在尝试这样做:
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 ()
在成功创建流时并没有真正被调用。事件的 'open' 也没有。
如何在 Promise 中实现这种逻辑?
你在这里做错的是.on('end', function ())
而不是.on('close', function ())
。
但为什么还要这样做呢? aws-sdk
提供了一个 .promise()
,你可以简单地做
s3.getObject(params).promise().then(...).catch(...)
或利用async/await.
假设您只在流中需要它,请尝试这样的操作:
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);
});
});
}
我建议阅读这篇 thread。
我正在尝试这样做:
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 ()
在成功创建流时并没有真正被调用。事件的 'open' 也没有。
如何在 Promise 中实现这种逻辑?
你在这里做错的是.on('end', function ())
而不是.on('close', function ())
。
但为什么还要这样做呢? aws-sdk
提供了一个 .promise()
,你可以简单地做
s3.getObject(params).promise().then(...).catch(...)
或利用async/await.
假设您只在流中需要它,请尝试这样的操作:
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);
});
});
}
我建议阅读这篇 thread。