首页 > 解决方案 > 使用 Promisify 从回调转换为 Async-Await 格式后,AWS S3 上传不起作用

问题描述

我正在使用aws-sdk的上传方法将文件从浏览器中的 React 应用程序上传到 S3 存储桶。

基于回调的上传方式如下:

var params = {Bucket: 'bucket', Key: 'key', Body: stream};
s3.upload(params, function(err, data) {
  console.log(err, data);
});

我用Promisify包装了它,让它像 Async-await 一样工作,如下所示:

const AWS = require('aws-sdk');
const { promisify } = require('es6-promisify');

... <in my React component> ...
async uploadFile() {
try {
    var params = {
      Bucket: <BucketName>,
      Key: <KeyName>,
      Body: <File Stream>
    };
    const res = await uploadToS3Async(params);
    console.log(res);
  } catch (error) {
    console.log(error);
  }
}

现在,当我uploadFile在某个触发的事件上调用函数时,它会产生以下错误:

TypeError: service.getSignatureVersion is not a function
    at ManagedUpload.bindServiceObject  
    at ManagedUpload.configure 
    at new ManagedUpload  
    at upload   
    at new Promise (<anonymous>)

标签: javascriptamazon-web-servicesamazon-s3promiseaws-sdk

解决方案


你不需要使用es6-promisify

你可以做:

try {
  const params = {Bucket: 'bucket', Key: 'key', Body: stream};  
  const data = await s3.upload(params).promise();
  console.log(data);
}
catch (err) {
  console.log(err);
}

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html


推荐阅读