【问题标题】:AWS S3 upload not working after converting from callback to Async-Await format using Promisify使用 Promisify 从回调转换为 Async-Await 格式后,AWS S3 上传不起作用
【发布时间】:2019-12-29 20:10:51
【问题描述】:

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

original callback based upload method 如下:

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

【问题讨论】:

  • 您提供的代码中没有getSignatureVersion
  • 甚至没有service

标签: javascript amazon-web-services amazon-s3 promise aws-sdk


【解决方案1】:

你不需要使用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

【讨论】:

    【解决方案2】:

    如果你想让它成为Promisify,那么你可以像这样简单地实现

    aws.js

    const params = {
        Bucket: 'bucket',
        Key: 'key',
        Body: stream
    };
    
    const awsService = {};
    
    awaService.upload = () => {
        return new Promise((resolve, reject) => {
            s3.upload(params, function(err, data) {
                if (err) {
                    return reject(err);
                }
                return resolve(data);
            });
        });
    };
    
    module.exports = awsService;
    
    

    在另一个文件上像这样调用

    util.js

    const awsService = require('./awsService');
    
    const utils = {};
    
    utils.upload = async () => {
        try {
            const result = await awsService.upload();
            return result;
        } catch (err) {
            console.log(err);
            throw err;
        }
    };
    
    module.exports = utils;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2018-12-12
      • 2019-12-14
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多