NestJS WebSocket适配器依赖注入AuthService后内部依赖未定义怎么解决
问题解决方法
可以通过app.get()方法正常获取包含完整依赖注入的AuthService实例,你遇到的内部依赖为undefined的问题,是模块导出规则、实例获取参数配置错误导致的,可按以下步骤排查修复:
第一步:确认AuthService所属模块已显式导出AuthService
你需要在定义AuthService的模块(比如AuthModule)的exports配置项中加入AuthService,否则跨模块获取时只会拿到未初始化依赖的孤立实例:@Module({ imports: [UsersModule, JwtModule], providers: [AuthService], exports: [AuthService] // 必须添加这行,对外暴露可注入的AuthService实例 }) export class AuthModule {}第二步:调用
app.get()时添加{ strict: false }参数
默认app.get()为严格查找模式,只会从当前调用上下文所属的模块查找Provider,添加该参数后会从全局应用的注入容器中查找已实例化的完整Provider:
修正后的适配器构造函数代码:constructor(private app: INestApplicationContext) { super(app); // 增加第二个参数关闭严格查找 this.authService = app.get(AuthService, { strict: false }); }第三步:确认适配器注册时机正确
你需要在Nest应用完全初始化完成后再注册自定义适配器,不要在模块的onModuleInit等生命周期钩子中提前注册,推荐在main.ts的app.bootstrap()完成后注册:
示例main.ts代码:async function bootstrap() { const app = await NestFactory.create(AppModule); // 等应用初始化完成后再注册适配器 app.useWebSocketAdapter(new AuthenticatedSocketIoAdapter(app)); await app.listen(3000); } bootstrap();
补充注意:你当前代码中
allowRequest是async异步函数,但调用this.authService.verifyToken时没有加await,如果verifyToken是异步方法(JWT校验包含异步逻辑或数据库查询时)会导致校验逻辑异常,建议补充await关键字。
内容的提问来源于stack exchange,提问作者skuallpa
相关产品推荐
相关产品推荐

