NestJS结合MikroORM无法注入EntityManager问题求助
NestJS + MikroORM + NX Monorepo 启动错误排查与解决
错误原因
- 缺失
@Injectable()装饰器:UserRepository类仅调用了Injectable();,未添加@符号,导致NestJS无法识别该类为可注入的Provider,依赖注入失败,EntityManager实例未被正确注入,出现undefined。 - 未注册仓库到DI容器:
PersistanceModule中仅在MikroOrmModule.forRoot()中声明了entities,但未通过MikroOrmModule.forFeature()注册对应的仓库,导致无法通过DI获取合法的仓库实例。 - 直接从EntityManager获取仓库的风险:在使用
EntitySchema而非装饰器实体的场景下,直接注入根EntityManager可能因作用域(如请求作用域)或打包后的上下文问题导致实例异常。
解决方案
步骤1:修复@Injectable()装饰器并优化仓库注入
修改UserRepository,添加正确的装饰器,改用@InjectRepository直接注入对应仓库:
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@mikro-orm/nestjs'; import { EntityRepository } from '@mikro-orm/postgresql'; import { IUserRepository, User } from '@vector/domain'; import { userSchema } from '../configurations/user.configuration'; @Injectable() export class UserRepository implements IUserRepository { constructor( @InjectRepository(userSchema) private readonly _repository: EntityRepository<User>, ) {} async findById(id: string): Promise<User | null> { return this._repository.findOne({ id }); } async findByEmail(email: string): Promise<User | null> { return this._repository.findOne({ email }); } async add(user: User): Promise<void> { const newUser = this._repository.create(user); this._repository.persist(newUser); await this._repository.getEntityManager().flush(); } async update(user: User): Promise<void> { await this._repository.nativeUpdate({ id: user.id }, user); } async delete(id: string): Promise<void> { await this._repository.nativeDelete({ id }); } }
步骤2:更新PersistanceModule注册仓库到DI容器
修改模块配置,添加MikroOrmModule.forFeature()注册实体仓库:
import { Module } from '@nestjs/common'; import { MikroOrmModule } from '@mikro-orm/nestjs'; import { UserRepository } from './repositories/user-repository'; import { userSchema } from './configurations/user.configuration'; @Module({ imports: [ MikroOrmModule.forRoot({ port: 5432, user: 'user', host: 'localhost', dbName: 'vector', password: 'password', entities: [userSchema], discovery: { warnWhenNoEntities: true }, }), MikroOrmModule.forFeature([userSchema]), ], providers: [UserRepository], exports: [UserRepository], }) export class PersistanceModule {}
步骤3:适配NX Webpack打包配置
在项目根目录的tsconfig.base.json中添加preserveSymlinks配置,避免Webpack打包时丢失实体Schema的引用:
{ "compilerOptions": { "preserveSymlinks": true, // 其他原有配置... } }
内容的提问来源于stack exchange,提问作者joseFrancisco
相关产品推荐
相关产品推荐

