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

AWS SDK v3 JS读取S3对象报错transformToString不存在,如何获取内容?

AWS SDK v3(旧版本)中如何将S3对象内容转为字符串并解析为JSON?

问题原因

你使用的AWS SDK v3版本(3.35.0)过低,transformToString()方法是在较晚的SDK版本(约3.118.0及以后)才被引入的,旧版本的response.Body不具备这个方法,因此触发TypeError。

解决方案

方案1:升级AWS SDK版本

直接将相关的AWS SDK包升级到最新稳定版,即可使用官方示例中的transformToString()方法。执行以下命令完成升级:

npm update @aws-sdk/client-s3 @aws-sdk/client-secrets-manager @aws-sdk/client-sts @aws-sdk/credential-provider-node @aws-sdk/s3-request-presigner

升级后可使用如下规范的TypeScript代码:

import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";

const s3Client = new S3Client({});

async function fetchAndParseS3Json() {
  const response = await s3Client.send(
    new GetObjectCommand({ 
      Bucket: "the-bucket-name", 
      Key: "the-file.json" 
    })
  );

  const contentStr = await response.Body?.transformToString();
  if (!contentStr) throw new Error("S3对象内容为空");
  
  const jsonData = JSON.parse(contentStr);
  // 这里添加你的后续处理逻辑
  return jsonData;
}

方案2:不升级SDK,用Node.js原生流处理

如果无法升级SDK,可利用Node.js的Readable流API将response.Body转换为字符串,以下提供两种实现方式:

方式A:使用stream.promises.readAll()(Node.js 16+支持)

import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
import { readAll } from "stream/promises";

const s3Client = new S3Client({});

async function fetchAndParseS3Json() {
  const response = await s3Client.send(
    new GetObjectCommand({ 
      Bucket: "the-bucket-name", 
      Key: "the-file.json" 
    })
  );

  if (!response.Body) throw new Error("S3对象内容为空");
  
  const contentBuffer = await readAll(response.Body);
  const contentStr = contentBuffer.toString("utf-8");
  const jsonData = JSON.parse(contentStr);
  // 后续处理逻辑
  return jsonData;
}

方式B:手动封装Promise处理流

import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";

const s3Client = new S3Client({});

// 封装流转字符串的工具函数
function streamToString(stream: NodeJS.ReadableStream): Promise<string> {
  return new Promise((resolve, reject) => {
    const chunks: Uint8Array[] = [];
    stream.on("data", chunk => chunks.push(chunk));
    stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
    stream.on("error", err => reject(err));
  });
}

async function fetchAndParseS3Json() {
  const response = await s3Client.send(
    new GetObjectCommand({ 
      Bucket: "the-bucket-name", 
      Key: "the-file.json" 
    })
  );

  if (!response.Body) throw new Error("S3对象内容为空");
  
  const contentStr = await streamToString(response.Body as NodeJS.ReadableStream);
  const jsonData = JSON.parse(contentStr);
  // 后续处理逻辑
  return jsonData;
}

内容的提问来源于stack exchange,提问作者whiterook6

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:17:06