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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:40:35