2

问题: util.promisify将使用错误优先回调样式的异步函数转换为 Promise。但是,它似乎不适用于 AWS 的S3.upload(向下滚动到 .upload),这是一个使用错误优先回调格式的异步函数。

原始格式:

const params = {Bucket: 'bucket', Key: 'key', Body: stream};
s3.upload(params, function(err, result) {
    if (err) {
        throw new Error(err);
    } else {
        console.log(result);
    }
});

承诺格式:

const params = {Bucket: 'bucket', Key: 'key', Body: stream};
const s3Upload = util.promisify(s3.upload);
s3Upload(params)
    .then( (result) => {
        console.log(result);
    })
    .catch( (err) => {
        throw new Error(err);
    });

但是以这种方式使用s3.upload会引发错误,

TypeError:service.getSignatureVersion 不是函数

如果util.promisify不一定适用于每个使用回调的异步函数,有没有办法预先确定一个函数是否可以使用它?或者,是否需要反复试验才能确定是否util.promisify可行?

4

2 回答 2

3

在回答您的问题之前,我想指出回调样式函数通常不是async functions. util.promisify用 Promise 包装一个回调风格的函数,这与将回调风格的函数包装在一个async函数中是一样的。

要解决您的问题,您可能需要this手动正确设置上传功能的上下文。看起来像这样:

const s3Upload = util.promisify(s3.upload.bind(s3));

否则,您遇到的问题是 Node.js 错误或 AWS 错误,我建议您提交错误报告。

于 2021-03-23T01:10:17.113 回答
3

Geoffrey 解释了为什么这可能不适用于您尝试的代码,但更好的是使用 AWS 接口中内置的承诺支持:

const params = {Bucket: 'bucket', Key: 'key', Body: stream};
s3.upload(params).promise().then((result) => {
    console.log(result);
}).catch( (err) => {
    console.log(err);
    throw err;
});

此处的 AWS 文档:https ://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html

于 2021-03-23T01:18:40.763 回答