NestJS TypeOrmModule注入Repository失败,提示找不到Connection依赖
报错根因
该报错是Nest依赖注入容器无法在TypeOrmModule上下文中找到Connection实例的provider,绝大多数场景是TypeORM与@nestjs/typeorm版本不匹配导致的,少数场景是自定义Repository写法不符合版本要求、依赖缓存异常导致。
解决方案
1. 核对版本匹配关系
不同版本的Nest TypeORM适配的TypeORM核心版本有强制要求,对应关系如下:
@nestjs/typeorm@8.x及更低版本:仅适配typeorm@0.2.x,该版本的连接实例名为Connection@nestjs/typeorm@9.x及更高版本:仅适配typeorm@0.3.x,该版本已废弃Connection,改用DataSource作为连接实例
执行下方命令查看当前安装的版本:
npm list typeorm @nestjs/typeorm
如果版本不匹配,卸载后重新安装对应版本即可,示例命令如下:
适配@nestjs/typeorm 9.x:
npm install @nestjs/typeorm@9 typeorm@0.3
适配@nestjs/typeorm 8.x:
npm install @nestjs/typeorm@8 typeorm@0.2
2. 修正自定义Repository写法
如果你自行封装了UserRepository类,需要根据版本调整写法:
- typeorm 0.2.x版本写法:
@EntityRepository(User) export class UserRepository extends Repository<User> {}
- typeorm 0.3.x版本已废弃
@EntityRepository装饰器,需要改为自定义provider注册:
// user.repository.ts export class UserRepository extends Repository<User> { constructor(dataSource: DataSource) { super(User, dataSource.createEntityManager()); } } // user.module.ts 中注册自定义Repository @Module({ imports: [TypeOrmModule.forFeature([User])], providers: [UserService, UserRepository], exports: [UserService], controllers: [UserController], })
3. 排查环境变量加载问题
如果你的TypeOrm配置依赖ConfigModule读取的环境变量,需要给ConfigModule开启全局配置,或者改为异步注册TypeOrmModule:
// 方案1:ConfigModule开启全局 ConfigModule.forRoot({ isGlobal: true, // 其余配置 }) // 方案2:TypeOrmModule异步注册 TypeOrmModule.forRootAsync({ useFactory: () => ({ type: 'postgres', // 其余配置项 synchronize: process.env.NODE_ENV !== 'prod', logging: process.env.NODE_ENV !== 'prod' && process.env.NODE_ENV !== 'test', entities: [User, Wiki], }) })
4. 清理依赖缓存
如果以上操作后仍报错,清理依赖缓存重新安装即可:
rm -rf node_modules package-lock.json npm install
内容的提问来源于stack exchange,提问作者Joseph Hwang
相关产品推荐
相关产品推荐

