如何使用aws-sdk同步上传文件到S3?
How to synchronously upload files to S3 using aws-sdk?
我正在尝试将文件上传到我的 S3 存储桶,然后 return 退出我的上传功能。问题是我 return 在上传 return 存储的数据之前退出了该功能。
我曾尝试将 async/await
与 s3.upload
一起使用,但我不认为 s3.upload
是一个承诺,因此它不会执行任何操作。
例如:
for (const file of files) {
const params = {
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
};
const stored = await s3.upload(params, (err, data) => {
if (err) console.log("error", err, err.stack);
return console.log(data);
});
console.log(stored);
}
console.log("leave loop")
我已尝试将异步实用程序模块与 async.each
和 async.eachSeries
一起使用 in this stack answer,如下所示:
const saveFile = async file => {
const params = {
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
};
s3.upload(params, (err, data) => {
if (err) console.log("error", err, err.stack);
console.log(data);
});
};
await async.eachSeries(files, saveFile, err => {
if (err) console.log(err);
});
console.log("leave loop")
但它仍然过早达到 "leave"。我误会了什么,但我不确定是什么。
更新:
s3.upload
return 是一个 managedUpload
对象 - 这似乎是 await 提前触发的原因。当managedUpload
为resolved/completed时触发回调。
那么有没有办法 await
完成的对象而不是 managedUpload
?
您应该尝试在 ManagedUpload
上调用 promise() 以获得 Promise 并等待其解决:
for (const file of files) {
const params = {
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
};
try {
const stored = await s3.upload(params).promise()
console.log(stored);
} catch (err) {
console.log(err)
}
}
console.log("leave loop")
我正在尝试将文件上传到我的 S3 存储桶,然后 return 退出我的上传功能。问题是我 return 在上传 return 存储的数据之前退出了该功能。
我曾尝试将 async/await
与 s3.upload
一起使用,但我不认为 s3.upload
是一个承诺,因此它不会执行任何操作。
例如:
for (const file of files) {
const params = {
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
};
const stored = await s3.upload(params, (err, data) => {
if (err) console.log("error", err, err.stack);
return console.log(data);
});
console.log(stored);
}
console.log("leave loop")
我已尝试将异步实用程序模块与 async.each
和 async.eachSeries
一起使用 in this stack answer,如下所示:
const saveFile = async file => {
const params = {
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
};
s3.upload(params, (err, data) => {
if (err) console.log("error", err, err.stack);
console.log(data);
});
};
await async.eachSeries(files, saveFile, err => {
if (err) console.log(err);
});
console.log("leave loop")
但它仍然过早达到 "leave"。我误会了什么,但我不确定是什么。
更新:
s3.upload
return 是一个 managedUpload
对象 - 这似乎是 await 提前触发的原因。当managedUpload
为resolved/completed时触发回调。
那么有没有办法 await
完成的对象而不是 managedUpload
?
您应该尝试在 ManagedUpload
上调用 promise() 以获得 Promise 并等待其解决:
for (const file of files) {
const params = {
Bucket: BUCKET_NAME,
Key: file.name,
Body: file.data
};
try {
const stored = await s3.upload(params).promise()
console.log(stored);
} catch (err) {
console.log(err)
}
}
console.log("leave loop")