Nest.js中TypeORM EntityRepository未注册仓库引发Cannot read 'create'错误
Nest.js TypeORM仓库注册失败(this为空)问题排查与解决
1. 移除Providers中重复的仓库注册
你的AnalysisModule同时在imports的TypeOrmModule.forFeature和providers数组中注册了StockAnalysisRepository,这会导致Nest注入未被TypeORM代理的原始类实例,而非具备Repository能力的代理对象,最终出现this为空的情况。
修改stock-analysis.module.ts,删除providers里的StockAnalysisRepository:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { StockAnalysisController } from './stock-analysis.controller'; import { StockAnalysisRepository } from './stock-analysis.repository'; import { StockAnalysisService } from './stock-analysis.service'; @Module({ imports: [TypeOrmModule.forFeature([StockAnalysisRepository])], controllers: [StockAnalysisController], providers: [StockAnalysisService], // 移除重复的StockAnalysisRepository exports: [TypeOrmModule], }) export class AnalysisModule {}
2. 检查TypeORM版本兼容性
如果你的TypeORM版本是0.3.x及以上,@EntityRepository装饰器已被官方弃用,不再生效,这是仓库无法正确注册的常见原因。此时需改用TypeORM新的自定义仓库方式:
方案A:注入Repository实例
- 修改仓库类,移除
@EntityRepository和继承Repository,改为注入Repository<StockAnalysis>:
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { StockAnalysisDto } from '../dtos/analysis/stock-analysis-dto'; import { StockAnalysis } from './stock-analysis.entity'; import { User } from '../user/user.entity'; @Injectable() export class StockAnalysisRepository { constructor( @InjectRepository(StockAnalysis) private readonly repo: Repository<StockAnalysis>, ) {} async analyseStock(user: User, stockAnalysisDto: StockAnalysisDto) { const { stock } = stockAnalysisDto; const stocksToAnalyse = this.repo.create(); // 使用注入的repo实例调用方法 } }
- 模块中改为注册实体而非仓库:
@Module({ imports: [TypeOrmModule.forFeature([StockAnalysis])], // 注册实体 controllers: [StockAnalysisController], providers: [StockAnalysisService, StockAnalysisRepository], // 仓库需加入providers exports: [TypeOrmModule], }) export class AnalysisModule {}
方案B:自定义仓库类(TypeORM推荐方式)
import { DataSource, Repository } from 'typeorm'; import { Injectable } from '@nestjs/common'; import { StockAnalysis } from './stock-analysis.entity'; import { StockAnalysisDto } from '../dtos/analysis/stock-analysis-dto'; import { User } from '../user/user.entity'; @Injectable() export class StockAnalysisRepository extends Repository<StockAnalysis> { constructor(private dataSource: DataSource) { super(StockAnalysis, dataSource.createEntityManager()); } async analyseStock(user: User, stockAnalysisDto: StockAnalysisDto) { const { stock } = stockAnalysisDto; const stocksToAnalyse = this.create(); // 此时this正常可用 } }
- 模块中需将仓库加入
providers,imports可注册实体或不注册,仓库通过DataSource完成初始化。
3. 检查实体与仓库的导入路径
确认StockAnalysis实体在仓库中的导入路径无拼写错误或相对路径错误,避免因实体未正确关联导致仓库初始化失败。
4. 验证Service中的注入方式
确保在StockAnalysisService中正确注入仓库:
- 旧版TypeORM(使用
@EntityRepository):
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { StockAnalysisRepository } from './stock-analysis.repository'; @Injectable() export class StockAnalysisService { constructor( @InjectRepository(StockAnalysisRepository) private readonly stockAnalysisRepo: StockAnalysisRepository, ) {} async analyse(user, dto) { return this.stockAnalysisRepo.analyseStock(user, dto); } }
- 新版自定义仓库(使用
@Injectable):
import { Injectable } from '@nestjs/common'; import { StockAnalysisRepository } from './stock-analysis.repository'; @Injectable() export class StockAnalysisService { constructor(private readonly stockAnalysisRepo: StockAnalysisRepository) {} async analyse(user, dto) { return this.stockAnalysisRepo.analyseStock(user, dto); } }
内容的提问来源于stack exchange,提问作者MSadiq
相关产品推荐
相关产品推荐

