为什么NestJS中的Service无法正常注入到Passport策略?
问题原因及解决方案
出现该问题的核心是NestJS依赖注入的自动类型匹配机制失效,常见触发原因如下:
- 导入路径大小写不一致
你在google.strategy.ts中导入AuthService的路径大小写和实际文件路径不匹配。比如实际文件名为auth.service.ts,导入时写为./Auth.service,Windows/macOS系统默认不区分文件名大小写,但NestJS的DI容器会依赖TypeScript生成的类型元数据做匹配,路径大小写错误会导致类型识别失效,因此按字符串token手动注入的@Inject('AuthService')可以正常工作。
解决方法:核对所有导入路径的大小写,保持和实际文件名完全一致。 - 存在循环依赖
如果AuthService中也导入了GoogleStrategy或者导入了依赖GoogleStrategy的其他服务,就会形成循环依赖,NestJS在处理循环依赖时会出现注入对象为undefined的情况。
解决方法:使用forwardRef包装注入对象,代码如下:import { forwardRef, Inject, Injectable } from '@nestjs/common'; @Injectable() export class GoogleStrategy extends PassportStrategy(Strategy, 'google') { constructor( @Inject(forwardRef(() => AuthService)) private authService: AuthService ) { super({ /*...*/ }); console.log(this.authService) } } - 手动实例化了GoogleStrategy
如果你在代码的其他位置使用new GoogleStrategy()手动创建实例,而非交给NestJS容器管理该类的实例,自动依赖注入就不会生效。
解决方法:删除手动实例化的代码,所有用到GoogleStrategy的地方都通过容器注入获取实例。
内容的提问来源于stack exchange,提问作者wonderkids
相关产品推荐
相关产品推荐

