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
相关产品推荐
相关产品推荐

