使用AWS SDK v3的PutObjectCommand上传S3返回空响应排查
问题原因分析
你的代码出现空响应的核心问题在于错误混用了AWS SDK的Promise调用和回调模式,同时存在Promise构造函数的不合理使用,具体拆解如下:
1. s3.send()调用方式错误
AWS SDK v3的send方法本身返回Promise,当你传入回调函数时,它会切换到回调模式,不再返回可被await的Promise状态。这就导致await s3.send(...)实际上没有等待到异步操作完成,而回调里的resolve和reject也永远不会触发——因为send在回调模式下不会主动处理Promise状态,最终response这个Promise一直处于pending状态,自然没有任何返回值。
2. 冗余的Promise包装+async构造函数
你用new Promise(async (resolve, reject) => {})的写法完全多余,还存在风险:async函数内部的错误会被自身的Promise捕获,无法传递给外层的reject,导致错误无法被正确抛出。
3. 额外问题:Body为空字符串
虽然这不是空响应的直接原因,但csvUploadParams里Body设为""会上传空文件到S3,若要上传真实文件内容,需替换为实际的文件流或内容。
修复后的代码示例
const csvUploadParams = { Bucket: Bucketname, Key: fileName + ".csv", Body: "你的文件内容或文件流", // 替换为实际内容 ContentType: "text/csv" }; // 直接使用send返回的Promise,无需手动包装 async function uploadToS3() { try { console.log("开始上传文件"); const csvParam = new PutObjectCommand(csvUploadParams); const data = await s3.send(csvParam); console.log("上传成功", JSON.stringify(data)); return data; } catch (err) { console.log("上传失败", err); throw err; } } // 调用函数并处理结果 uploadToS3() .then(response => console.log("CSV Upload 响应 : ", response)) .catch(err => console.error("处理错误", err));
内容的提问来源于stack exchange,提问作者Keerthana Hemachandran
相关产品推荐
相关产品推荐

