TypeDI在Controller注入Repository报错:fieldSetRepo未定义求助
解决TypeDI注入Repository后
fieldSetRepo为undefined的问题 以下是常见原因及对应修复方案:
1. 确保Controller被TypeDI容器托管
你的FieldSettingsController必须使用@Service(或对应框架的控制器装饰器,比如NestJS的@Controller)标记,让TypeDI识别并管理它的实例,自动完成依赖注入。
import { Service } from 'typedi'; import { InjectRepository } from 'typeorm-typedi-extensions'; import { FieldSettings } from './field-settings.entity'; import { Repository } from 'typeorm'; @Service() // 关键:必须添加该装饰器 export class FieldSettingsController { constructor( @InjectRepository(FieldSettings) private readonly fieldSetRepo: Repository<FieldSettings> ) {} async createFieldSetting(data: Partial<FieldSettings>) { return this.fieldSetRepo.save(data); } }
2. 构造函数参数必须添加访问修饰符
如果构造函数的参数没有private或public修饰符,TypeScript不会自动将其绑定为类的实例属性,导致this.fieldSetRepo不存在。
错误写法:
constructor( @InjectRepository(FieldSettings) fieldSetRepo: Repository<FieldSettings> // 缺少访问修饰符 ) {}
正确写法:
constructor( @InjectRepository(FieldSettings) private readonly fieldSetRepo: Repository<FieldSettings> // 添加private readonly ) {}
3. 禁止直接new Controller实例,必须从容器获取
手动通过new FieldSettingsController()创建实例时,TypeDI不会介入注入流程,依赖会为空。必须通过TypeDI容器获取实例:
import { Container } from 'typedi'; // 正确方式:从容器获取实例 const controller = Container.get(FieldSettingsController); await controller.createFieldSetting({ /* 业务数据 */ }); // 错误方式:直接new const controller = new FieldSettingsController(); // 此时fieldSetRepo为undefined
4. 确认TypeDI与TypeORM的集成配置正确
若使用typeorm-typedi-extensions,需在TypeORM配置中指定TypeDI为依赖注入容器:
在ormconfig.js或TypeORM配置对象中添加:
{ // 其他配置项... dependencyInjector: 'typedi' }
部分场景下需显式初始化TypeDI容器:
import { Container } from 'typedi'; Container.initialize();
5. 检查装饰器导入是否正确
确保@InjectRepository从typeorm-typedi-extensions导入,而非TypeORM原生包(原生装饰器不兼容TypeDI)。
错误导入:
import { InjectRepository } from 'typeorm'; // 原生包,不支持TypeDI注入
正确导入:
import { InjectRepository } from 'typeorm-typedi-extensions'; // 正确的集成包
内容的提问来源于stack exchange,提问作者Nitin Kumar
相关产品推荐
相关产品推荐

