Angular迁移至新构建系统后@aws-sdk/lib-storage的Upload功能失效
AWS S3上传在Angular新构建系统下报错:Cannot read properties of undefined (reading 'done')
问题分析
这个错误本质是Upload实例的done()方法未被正确加载,大概率是Angular构建系统迁移(比如切换到ESBuild)后,模块解析或tree shaking规则变化导致AWS SDK的代码未被正确处理。
解决方案
1. 统一AWS SDK依赖版本
确保@aws-sdk/lib-storage和@aws-sdk/client-s3版本完全一致,版本不匹配会导致内部依赖异常:
# 查看当前版本 npm list @aws-sdk/lib-storage @aws-sdk/client-s3 # 升级到最新稳定版 npm install @aws-sdk/lib-storage@latest @aws-sdk/client-s3@latest
2. 调整Angular构建配置
新构建系统(如ESBuild)对CommonJS模块的处理更严格,需在angular.json中允许相关依赖:
"projects": { "your-project-name": { "architect": { "build": { "options": { // 其他配置... "allowedCommonJsDependencies": [ "@aws-sdk/lib-storage", "@aws-sdk/client-s3" ] } } } } }
3. 强制导入ESM模块入口
直接指定SDK的ESM版本入口,避免构建系统解析错误:
import { Upload } from "@aws-sdk/lib-storage/dist-esm/index.js"; import { S3Client } from "@aws-sdk/client-s3/dist-esm/index.js";
4. 验证S3Client初始化完整性
确保S3Client配置正确,初始化失败可能导致实例异常:
const s3Client = new S3Client({ region: "us-east-1", // 替换为你的区域 credentials: { accessKeyId: "YOUR_ACCESS_KEY", secretAccessKey: "YOUR_SECRET_KEY" } }); const parallelUploads3 = new Upload({ client: s3Client, params: { Bucket: "your-bucket", Key: "file-key", Body: file } });
原因说明
Angular新构建系统(如ESBuild)相比旧Webpack,tree shaking更激进,且对CommonJS模块的兼容性处理不同。AWS SDK部分模块仍使用CommonJS格式,若未正确配置,构建工具可能误删done()方法相关代码,或导致模块加载不完整。
内容的提问来源于stack exchange,提问作者Mohamed Zakaria
相关产品推荐
相关产品推荐

