TypeScript+Node.js S3上传报错:S3缺少S3Client的destroy等属性
问题描述
用TypeScript开发Node.js后端时碰到以下类型错误:
Type 'S3' is missing the following properties from type 'S3Client': destroy, middlewareStack, sendts(2739)
错误出现在上传文件到AWS S3的代码中,具体代码如下:
import AWS from "aws-sdk"; import multer from "multer"; import multerS3 from "multer-s3"; let S3 = new AWS.S3({ accessKeyId: process.env.AWS_KEY, secretAccessKey: process.env.AWS_SECRET }) const upload = multer({ storage: multerS3({ s3:S3, // 错误位置 bucket: 'bucket-name', metadata: function (req, file, cb) { cb(null, { fieldName: file.fieldname }); }, key: function (req, file, cb) { cb(null, Date.now().toString()) } }) }) export { upload }
解决方案
方案1:降级multer-s3适配AWS SDK v2
你当前使用的是aws-sdk v2,但新版multer-s3已适配AWS SDK v3的S3Client类型,导致类型不兼容。可以降级到支持v2的版本:
- 卸载当前multer-s3:
npm uninstall multer-s3
- 安装兼容v2的版本(例如v2.10.0):
npm install multer-s3@2.10.0
- 保持原有代码不变,类型错误会自动消失。
方案2:升级到AWS SDK v3
如果想跟进新版本,切换到AWS SDK v3:
- 卸载旧版SDK:
npm uninstall aws-sdk
- 安装v3的S3相关包:
npm install @aws-sdk/client-s3
- 修改代码如下:
import { S3Client } from "@aws-sdk/client-s3"; import multer from "multer"; import multerS3 from "multer-s3"; const s3Client = new S3Client({ credentials: { accessKeyId: process.env.AWS_KEY!, secretAccessKey: process.env.AWS_SECRET! }, region: "你的存储桶区域" // 例如us-east-1,必须填写 }); const upload = multer({ storage: multerS3({ s3: s3Client, bucket: 'bucket-name', metadata: (req, file, cb) => { cb(null, { fieldName: file.fieldname }); }, key: (req, file, cb) => { cb(null, Date.now().toString()) } }) }) export { upload }
注意:AWS SDK v3必须显式指定存储桶区域,且凭证的写法与v2不同。
内容的提问来源于stack exchange,提问作者sauravscode
相关产品推荐
相关产品推荐

