nestjs 无法注入服务
问题发现
- 在 viewService 里面导入 UserService,发现一直提示错误,没有找到可以注入的内容
- 检查了一遍代码,确认逻辑代码没有问题
- 怀疑是不是循环依赖了,检查代码,发现代码基本与其他 Moduel 的服务相同,没有出现循环依赖的情况
- 打印 ModuleContainer,在当前 ViewModule 里面找到了导入的 UserModule,也存在 UserService
view.service.ts 尝试打印是否成功导入 UserModule
1 | () |
view.module.ts
1 | ({ |
view.service.ts
1 | export type ViewRelationType = "topic"; |
控制台
1 | [error] 2021-07-28 18:11:32.1 [ExceptionHandler] Nest can't resolve dependencies of the ViewService (?, ViewEntityRepository). Please make sure that the argument dependency at index [0] is available in the ViewModule context. |
解决问题
- 再次检查代码,发现 view.service.ts 导出了三个东西,一个 type,一个 interface,还有一个 viewService 服务
- 全文查找导出的接口,发现在一个实体里面有这个类型的引入,就是 JoinListInterface.
topic.entity.ts
1 | "topics", { schema: "42how" }) ( |
尝试删除 JoinListInterface ,服务注入成功
原本以为 ts 的 interface,type 是不参与到编译过后的 js 文件,检查编译后 topic.entity.js 文件,发现
const view_service_1 = require("../modules/view/view.service");
这一句,虽然 interface 没有被使用,但是这个 js 文件被引入了。因为这个实体类被引入的比较多,产生了循环依赖,在 nestjs 进行注入的时候,这个文件导出是 undefined,查找不到服务,无法注入。
总结
- ts 中 export 的类型文件应该单独定义,不要跟逻辑代码放在一个文件。
- 类型文件虽然没有参与编译,但是会引入文件,如果引用的过于复杂,会导致循环依赖的情况
- 感谢青木大佬的帮助