使用 Promisify 从回调转换为 Async-Await 格式后,AWS S3 上传不起作用
AWS S3 upload not working after converting from callback to Async-Await format using Promisify
我正在使用 upload method from aws-sdk 从浏览器中的 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 包装它以像异步等待一样工作,如下所示:
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>)
您不需要使用 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
如果你想把它变成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;
我正在使用 upload method from aws-sdk 从浏览器中的 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 包装它以像异步等待一样工作,如下所示:
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>)
您不需要使用 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
如果你想把它变成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;