Udemy《NestJS从0到精通》课程TypeORM仓库配置废弃问题求助
解决NestJS中TypeORM Repository配置废弃问题
TypeORM 0.3+版本废弃了旧的@EntityRepository装饰器及部分Repository实例化方式,下面针对NestJS场景给出适配的新配置方案:
一、默认Repository注入(兼容原有写法)
如果课程中使用的是基础的@InjectRepository()注入方式,只需确保@nestjs/typeorm版本适配TypeORM 0.3+(推荐升级到@nestjs/typeorm@10.x及以上),原有写法依然可用:
模块配置
// user.module.ts import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { User } from './user.entity'; import { UserService } from './user.service'; @Module({ imports: [TypeOrmModule.forFeature([User])], providers: [UserService], }) export class UserModule {}
服务中注入使用
// user.service.ts import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { User } from './user.entity'; @Injectable() export class UserService { constructor( @InjectRepository(User) private readonly userRepository: Repository<User>, ) {} findAllUsers() { return this.userRepository.find(); } }
二、自定义Repository(替代废弃的@EntityRepository)
若课程中使用了自定义Repository,原@EntityRepository装饰器已被废弃,改用DataSource实例化自定义Repository:
定义自定义Repository
// user.repository.ts import { Repository, DataSource } from 'typeorm'; import { User } from './user.entity'; export class UserRepository extends Repository<User> { constructor(dataSource: DataSource) { super(User, dataSource.createEntityManager()); } // 自定义业务方法 async findUserByEmail(email: string) { return this.findOne({ where: { email } }); } }
模块中注册自定义Repository
// user.module.ts import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { DataSource } from 'typeorm'; import { User } from './user.entity'; import { UserRepository } from './user.repository'; import { UserService } from './user.service'; @Module({ imports: [TypeOrmModule.forFeature([User])], providers: [ { provide: UserRepository, useFactory: (dataSource: DataSource) => new UserRepository(dataSource), inject: [DataSource], }, UserService, ], }) export class UserModule {}
服务中注入自定义Repository
// user.service.ts import { Injectable, Inject } from '@nestjs/common'; import { UserRepository } from './user.repository'; @Injectable() export class UserService { constructor( @Inject(UserRepository) private readonly userRepository: UserRepository, ) {} async getByEmail(email: string) { return this.userRepository.findUserByEmail(email); } }
三、全局数据源配置(适配TypeORM 0.3+)
如果全局数据库配置提示废弃,确保TypeOrmModule.forRoot的配置项符合TypeORM 0.3+规范:
// app.module.ts import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', // 替换为你的数据库类型 host: 'localhost', port: 3306, username: 'root', password: 'your_password', database: 'test_db', entities: [__dirname + '/**/*.entity{.ts,.js}'], synchronize: true, // 生产环境建议关闭 autoLoadEntities: true, // 0.3+新增,自动加载实体 }), ], }) export class AppModule {}
内容的提问来源于stack exchange,提问作者Evan Blanco Rojas
相关产品推荐
相关产品推荐

