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

NestJS集成AWS S3报错:this._s3.listBuckets不是函数

解决NestJS中AWS S3 listBuckets调用报错问题

问题现象

在NestJS项目中对接AWS S3,尝试调用listBuckets获取存储桶列表时,接口返回500内部错误,控制台输出:

ERROR [ExceptionsHandler] this.serviceS3.listBuckets is not a function

问题原因

自定义Provider时直接将S3类作为useValue注入,而非S3实例。类本身没有listBuckets实例方法,只有实例才具备该方法。此外,nest-aws-sdk已经封装了S3的注入逻辑,无需手动创建Provider。

修复方案

方案1:使用nest-aws-sdk自带的注入方式(推荐)

  1. 移除自定义Provider
    删除app.module.ts中自定义的S3 Provider配置:

    // 删掉这段配置
    {
      provide: S3Lib,
      useValue: S3,
    },
    
  2. 修改Service注入方式
    使用nest-aws-sdk提供的InjectS3装饰器注入S3实例:

    import { InjectS3 } from 'nest-aws-sdk';
    import { S3 } from 'aws-sdk';
    
    // ...
    constructor(
      @InjectS3() private readonly _s3: S3,
    ) {}
    
  3. 异步化listBuckets方法
    将回调式调用改为Promise/async-await,适配Nest的响应式处理:

    async listBuckets() {
      try {
        const data = await this._s3.listBuckets().promise();
        console.log('存储桶列表:', data.Buckets);
        return data.Buckets;
      } catch (err) {
        console.error('获取存储桶列表失败:', err);
        throw err; // 抛出错误让Nest统一处理响应
      }
    }
    
  4. 控制器方法异步化

    @Get('/bucket/list')
    async listBuckets() {
      return this.s3Service.listBuckets();
    }
    

方案2:保留自定义Provider(手动创建实例)

若需保留自定义Provider,需创建S3实例而非注入类:

// app.module.ts中修改Provider
{
  provide: S3Lib,
  useFactory: (configService: ConfigService) => {
    return new S3({
      endpoint: configService.get<string>('S3_URL'),
      credentials: {
        accessKeyId: configService.get<string>('S3_ACCESS_KEY'),
        secretAccessKey: configService.get<string>('S3_SECRET_KEY'),
      },
    });
  },
  inject: [ConfigService],
}

后续Service注入和方法修改同方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:10:26