util.promisify 将使用回调的异步函数转换为 Promises。为什么它不适用于遵循该格式的 AWS S3.upload?
util.promisify converts async functions that use callbacks to Promises. Why doesn't it work with AWS S3.upload which follows that format?
问题: util.promisify converts an async function that uses the error-first callback style to a Promise. However it doesn't seem to work with 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);
}
});
Promisify 格式:
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 is not a function
如果 util.promisify
不一定适用于每个使用回调的异步函数,有没有办法预先确定某个函数是否适用于它?还是通过反复试验来确定 util.promisify
是否有效?
在回答您的问题之前,我想指出回调样式函数通常不是 async function
s。 util.promisify
用 promise 包装回调样式函数,这与将回调样式函数包装在 async
函数中是一样的。
要解决您的问题,您可能需要手动正确设置上传功能的 this
上下文。那看起来像这样:
const s3Upload = util.promisify(s3.upload.bind(s3));
否则,您遇到的问题是 Node.js 错误或 AWS 错误,我建议提交错误报告。
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
问题: util.promisify converts an async function that uses the error-first callback style to a Promise. However it doesn't seem to work with 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);
}
});
Promisify 格式:
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 is not a function
如果 util.promisify
不一定适用于每个使用回调的异步函数,有没有办法预先确定某个函数是否适用于它?还是通过反复试验来确定 util.promisify
是否有效?
在回答您的问题之前,我想指出回调样式函数通常不是 async function
s。 util.promisify
用 promise 包装回调样式函数,这与将回调样式函数包装在 async
函数中是一样的。
要解决您的问题,您可能需要手动正确设置上传功能的 this
上下文。那看起来像这样:
const s3Upload = util.promisify(s3.upload.bind(s3));
否则,您遇到的问题是 Node.js 错误或 AWS 错误,我建议提交错误报告。
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