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

使用@aws-sdk/client-s3与graphql-upload上传时ReadableStream未定义问题

问题分析与解决方案

问题描述

用@aws-sdk/client-s3搭配graphql-upload做文件上传时,调用@aws-sdk/lib-storage里的Upload类会报错ReferenceError: ReadableStream is not defined;要是直接用PutObjectCommand上传,又会收到提示Are you using a Stream of unknown length as the Body of a PutObject request? Consider using Upload instead from @aws-sdk/lib-storage.,陷入两难。

错误原因

说白了就是Node.js环境里没全局的ReadableStream对象,但@aws-sdk/lib-storage的Upload内部逻辑又要用到它。具体可能是这几种情况:

  • Node.js版本太低(低于16.x):ReadableStream属于Web Streams API,Node.js 16及以上才把它挂到全局;16以下得手动从stream/web模块导入。
  • AWS SDK环境判断抽风:部分版本的@aws-sdk/lib-storage可能把Node.js环境当成了浏览器,硬要调用全局的ReadableStream。
  • 依赖版本不配套:@aws-sdk/client-s3和@aws-sdk/lib-storage版本不一样,导致内部流处理逻辑冲突。

解决方案

1. 升级Node.js版本(首推)

把Node.js升到16.x或更高,新版本默认就把ReadableStream挂到全局了,不用额外配置就能解决这个错误。

2. 手动全局挂载ReadableStream(适配低版本Node.js)

要是没法升级Node.js,就在项目入口文件(比如main.ts或者app.ts)里加这段代码,手动导入并挂载ReadableStream:

import { ReadableStream } from 'stream/web';

// 挂到全局对象上
globalThis.ReadableStream = ReadableStream;

3. 确保AWS SDK依赖版本一致

检查package.json里@aws-sdk/client-s3和@aws-sdk/lib-storage的版本,必须完全相同,别让版本不兼容搞出流处理的问题。比如:

{
  "dependencies": {
    "@aws-sdk/client-s3": "^3.400.0",
    "@aws-sdk/lib-storage": "^3.400.0"
  }
}

4. 转换流格式(备选方案)

要是上面的方法都不管用,可以试试把graphql-upload返回的Node.js可读流转成Web版的ReadableStream再传给SDK:

import { Readable } from 'stream';
import { ReadableStream as NodeReadableStream } from 'stream/web';

// 调用上传函数前转一下流
const fileStream = file.createReadStream();
const webStream = NodeReadableStream.from(fileStream);

await this.s3Service.s3UploadPhoto(webStream, file.filename, file.mimetype);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:50:28