如何在NestJS子类中注入依赖?现有代码报错求助
解决NestJS子类依赖注入问题
报错原因
Nest无法解析SendMessageAuthorizationService的依赖,核心问题是:你在构造函数中依赖了UserChatGateway接口,但仅在模块中注册了实现类UserChatAdapter,没有告诉Nest当需要UserChatGateway时应该注入哪个具体实现。TypeScript接口编译后会被移除,Nest无法自动关联接口与实现类。
解决方案
1. 绑定接口与实现类
修改ChatModule的providers配置,添加自定义provider,将UserChatGateway接口映射到UserChatAdapter实现:
@Module({ imports: [], controllers: [ChatController], providers: [ SendMessageAuthorizationService, { provide: UserChatGateway, // 接口作为注入标识 useClass: UserChatAdapter // 指定对应的实现类 } ] }) export class ChatModule {}
2. 明确注入标识
在SendMessageAuthorizationService的构造函数中,用@Inject装饰器指定要注入的标识(即UserChatGateway):
@Injectable() export class SendMessageAuthorizationService { private getUserChatRule: GetUserChatRule; constructor( @Inject(UserChatGateway) private readonly userChatGateway: UserChatGateway ) { this.getUserChatRule = new GetUserChatRule(userChatGateway); } execute() { return "hello world"; } }
可选:让GetUserChatRule纳入Nest依赖管理
如果希望GetUserChatRule的依赖也由Nest自动注入,而非手动new,可以给它加上@Injectable装饰器:
@Injectable() export default class GetUserChatRule { constructor( @Inject(UserChatGateway) private readonly userChatGateway: UserChatGateway ) {} apply() { return "hello world"; } }
然后在SendMessageAuthorizationService中直接注入GetUserChatRule:
@Injectable() export class SendMessageAuthorizationService { constructor( private readonly getUserChatRule: GetUserChatRule ) {} execute() { return this.getUserChatRule.apply(); } }
同时在ChatModule的providers中添加GetUserChatRule:
@Module({ imports: [], controllers: [ChatController], providers: [ SendMessageAuthorizationService, GetUserChatRule, { provide: UserChatGateway, useClass: UserChatAdapter } ] }) export class ChatModule {}
关键说明
Nest的依赖注入系统依赖可识别的注入标识,TypeScript接口无法作为标识(编译后不存在),因此必须通过provide+useClass的方式显式绑定接口与实现,确保Nest能找到对应的依赖项。
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

