NestJS中GraphQL模块注入DataLoaderService显示undefined问题
问题排查与解决
核心原因
你的GraphQLModule.forRootAsync配置中,inject数组仅声明了ConfigService,未将DataLoaderService加入注入列表。NestJS的依赖注入机制要求,useFactory函数的参数必须与inject数组中的提供者一一对应,未声明的参数会被注入undefined。
同时从启动日志可见,undefined的打印发生在DataLoaderModule初始化之前——这是因为NestJS处理GraphQLModule的工厂函数时,未被声明的依赖不会触发对应模块的提前初始化,导致DataLoaderService实例尚未创建就被尝试注入。
修复步骤
修改GraphQLModule的配置,将DataLoaderService添加到inject数组中:
GraphQLModule.forRootAsync<ApolloDriverConfig>({ driver: ApolloDriver, imports: [DataLoaderModule], useFactory: async ( configService: ConfigService, dataLoaderService: DataLoaderService, ) => { console.log(dataLoaderService); // 现在会输出实例对象 return { debug: configService.get<boolean>('debug'), playground: configService.get<boolean>('graphql.playground'), typePaths: ['./**/*.graphql'], definitions: { path: join( process.cwd(), 'src/modules/domains/graphql/generated.ts', ), outputAs: 'class', }, resolvers: { JSON: GraphQLJSON, }, context: () => { return { loaders: dataLoaderService.getLoaders(), }; }, }; }, inject: [ConfigService, DataLoaderService], // 新增DataLoaderService }),
额外提示
如果你的DataLoaderService需要是请求级别的(每个请求创建新实例),建议将context函数改为接收请求参数,并在其中获取请求级的DataLoader实例,避免跨请求数据污染。但当前问题的核心是依赖注入的声明缺失,上述修改即可解决undefined问题。
内容的提问来源于stack exchange,提问作者nmtri
相关产品推荐
相关产品推荐

