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自带的注入方式(推荐)
移除自定义Provider
删除app.module.ts中自定义的S3 Provider配置:// 删掉这段配置 { provide: S3Lib, useValue: S3, },修改Service注入方式
使用nest-aws-sdk提供的InjectS3装饰器注入S3实例:import { InjectS3 } from 'nest-aws-sdk'; import { S3 } from 'aws-sdk'; // ... constructor( @InjectS3() private readonly _s3: S3, ) {}异步化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统一处理响应 } }控制器方法异步化
@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
相关产品推荐
相关产品推荐

