升级AWS SDK后修复S3数据报错:Property 'on'不存在
解决AWS SDK v3升级后S3 GetObject流类型报错:
Property 'on' does not exist on type 'SdkStream<Readable|ReadableStream|Blob>' 问题根源
AWS SDK v3在3.200+版本(你的场景是从3.197升级到3.279)中,调整了S3 GetObject接口返回的Body类型:原本直接返回Node.js的Readable流、浏览器的ReadableStream或Blob,现在统一用SdkStream做了包装。SdkStream本身没有on方法,所以原来直接调用data.Body.on('data', ...)的写法会触发类型错误。
解决方案
根据运行环境(Node.js/浏览器),将SdkStream转换为对应平台的流类型即可:
1. Node.js环境
使用@aws-sdk/util-stream-node包中的fromSdkStream工具,将SdkStream转换为Node.js标准Readable流:
先确保安装依赖(未安装则执行):
npm install @aws-sdk/util-stream-node
修改代码:
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3"); const { fromSdkStream } = require("@aws-sdk/util-stream-node"); const s3Client = new S3Client({ region: "你的区域" }); async function processS3Object() { const sourceBucket = { Bucket: "你的存储桶名", Key: "你的对象键" }; const data = await s3Client.send(new GetObjectCommand(sourceBucket)); // 将SdkStream转换为Node.js Readable流 const readableStream = fromSdkStream(data.Body); // 正常监听流事件 readableStream.on('data', (chunk) => { // 处理数据块,比如转换为字符串或写入文件 console.log("收到数据块:", chunk.toString()); }); readableStream.on('end', () => { console.log("流读取完成"); }); readableStream.on('error', (err) => { console.error("流读取错误:", err); }); } processS3Object();
2. 浏览器环境
使用@aws-sdk/util-stream-browser包中的fromSdkStream工具,转换为浏览器标准ReadableStream:
安装依赖(未安装则执行):
npm install @aws-sdk/util-stream-browser
修改代码:
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3"; import { fromSdkStream } from "@aws-sdk/util-stream-browser"; const s3Client = new S3Client({ region: "你的区域" }); async function processS3Object() { const sourceBucket = { Bucket: "你的存储桶名", Key: "你的对象键" }; const data = await s3Client.send(new GetObjectCommand(sourceBucket)); const webStream = fromSdkStream(data.Body); // 使用浏览器Stream API处理,比如转换为文本 const reader = webStream.getReader(); let result = ""; while (true) { const { done, value } = await reader.read(); if (done) break; result += new TextDecoder().decode(value); } console.log("读取到的内容:", result); } processS3Object();
3. 通用简化方式(SDK新版本支持)
如果使用的SDK版本在3.250+,可以直接调用SdkStream的实例方法完成转换:
- Node.js环境:
data.Body.transformToNodeStream() - 浏览器环境:
data.Body.transformToWebStream()
示例(Node.js):
const data = await s3Client.send(new GetObjectCommand(sourceBucket)); const nodeStream = data.Body.transformToNodeStream(); nodeStream.on('data', (chunk) => { /* 处理逻辑 */ });
内容的提问来源于stack exchange,提问作者Interlated
相关产品推荐
相关产品推荐

