NestJS集成TypeORM报错:无法解析DataSource依赖(npm公共模块场景)
问题描述
使用版本:TypeORM 0.3.12,@nestjs/typeorm 9.0.1
拥有四个NestJS仓库:
- entity:npm仓库,包含实体定义
- base-service:npm仓库,包含a-service和b-service复用的公共模块与服务
- a-service:业务服务,引入base-service的模块
- b-service:业务服务,引入base-service的模块
代码片段
1. entity仓库的user.entity文件
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() idx: number; @Column('varchar', { length: 100 }) id: string; }
2. base-service仓库的代码
base-user.module.ts:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { BaseUserRepository } from './base-user.repository'; import { User } from 'entity'; @Module({ imports: [TypeOrmModule.forFeature([User])], providers: [BaseUserRepository], exports: [], }) export class BaseUserModule {}
base-user.repository.ts:
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { User } from 'entity' @Injectable() export class BaseUserRepository { constructor(@InjectRepository(User) private readonly repository: Repository<User>) {} }
3. a-service仓库的app.module.ts文件
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { MysqlConfigService } from './app/mysql/mysql-config.service'; import { BaseUserModule } from 'base-service'; @Module({ imports: [ TypeOrmModule.forRootAsync({ useClass: MysqlConfigService }), BaseUserModule, ], }) export class AppModule {}
运行错误
Error: Nest can't resolve dependencies of the UserRepository (?). Please make sure that the argument DataSource at index [0] is available in the TypeOrmModule context.
猜测原因:npm安装的base-service中TypeOrmModule.forFeature([User])无法获取主应用的TypeORM上下文。
解决方案
1. 修复BaseUserRepository的缺失导入
base-user.repository.ts中缺少Repository类型的导入,补充后代码如下:
import { Injectable } from '@nestjs/common'; import { InjectRepository, Repository } from '@nestjs/typeorm'; import { User } from 'entity' @Injectable() export class BaseUserRepository { constructor(@InjectRepository(User) private readonly repository: Repository<User>) {} }
2. 调整BaseUserModule的导出配置
BaseUserModule需要导出TypeORM特征模块和仓库类,确保主应用能共享TypeORM上下文:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { BaseUserRepository } from './base-user.repository'; import { User } from 'entity'; @Module({ imports: [TypeOrmModule.forFeature([User])], providers: [BaseUserRepository], exports: [TypeOrmModule.forFeature([User]), BaseUserRepository], }) export class BaseUserModule {}
3. 统一依赖版本
检查a-service、base-service、entity三个仓库的package.json,确保TypeORM和@nestjs/typeorm的版本完全一致,避免版本差异导致的上下文隔离问题。
4. 可选:改用动态模块(若上述方案无效)
将BaseUserModule改为动态模块,让主应用显式初始化模块,确保上下文传递:
// base-service的base-user.module.ts import { Module, DynamicModule } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { BaseUserRepository } from './base-user.repository'; import { User } from 'entity'; @Module({}) export class BaseUserModule { static forRoot(): DynamicModule { return { module: BaseUserModule, imports: [TypeOrmModule.forFeature([User])], providers: [BaseUserRepository], exports: [TypeOrmModule.forFeature([User]), BaseUserRepository], }; } }
在a-service的app.module.ts中使用动态模块导入:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { MysqlConfigService } from './app/mysql/mysql-config.service'; import { BaseUserModule } from 'base-service'; @Module({ imports: [ TypeOrmModule.forRootAsync({ useClass: MysqlConfigService }), BaseUserModule.forRoot(), ], }) export class AppModule {}
内容的提问来源于stack exchange,提问作者SeungJun
相关产品推荐
相关产品推荐

