You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:43:04