以前,TypeORM 存储库可以扩展并直接注入到服务中,例如:
import { User } from './entities/user.entity';
import { EntityRepository, Repository } from 'typeorm';
@EntityRepository(User)
export class UsersRepo extends Repository<User> {
// my custom repo methods
}
import { Injectable } from '@nestjs/common'
import { UsersRepo } from './users.repo';
@Injectable()
export class UsersService {
constructor(private readonly usersRepo: UsersRepo) {}
}
但是从 TypeORM 3.0.0 版本开始不支持通过继承扩展存储库。
如何在 NestJS 9 中实现这样的行为(依赖于 TypeORM 3.+)?我想到的唯一解决方案是将自定义方法添加到服务层。但我想将所有与 ORM 相关的方法(查询、聚合等)保留在存储库层中。
让我直接告诉你:我不知道这是否是一个推荐的解决方案,我不知道TypeORM的作者是否真的考虑过这种方法。但我一分钟前刚刚做的是这样的:
@Injectable()
export class UserRepository extends Repository<UserEntity> {
constructor(
@InjectRepository(UserEntity)
repository: Repository<UserEntity>
) {
super(repository.target, repository.manager, repository.queryRunner);
}
}
最好的部分:它有效:D
我用:
"@nestjs/typeorm": "^9.0.0"
只是让你知道。
我会继续检查它是否不会破坏任何东西,但就目前而言,似乎是一个很好的解决方法。
希望对您有帮助:
import { DataSource, Repository } from 'typeorm';
import { EntityTarget } from 'typeorm/common/EntityTarget';
export class GenericRepository<T> extends Repository<T> {
constructor(target: EntityTarget<T>, dataSource: DataSource) {
super(target, dataSource.createEntityManager());
}
async someCommonMethod() {
return {};
}
}
import { DataSource } from 'typeorm';
import { User } from '../../entities/User';
import { Injectable } from '@nestjs/common';
import { GenericRepository } from '../common/generic.repository';
@Injectable()
export class UserRepository extends GenericRepository<User> {
constructor(private dataSource: DataSource) {
super(User, dataSource.createEntityManager());
}
}
import { Injectable } from '@nestjs/common';
import { User } from '../../entities/User';
import { InjectRepository } from '@nestjs/typeorm';
import { UsersRepository } from './users.repository';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private readonly usersRepository: UsersRepository,
) {}
}
这在这里解决了(与这里的其他答案类似,但更完整): 如何在NestJS中使用TypeORM(MongoDB)创建自定义存储库?
不知道为什么他们弃用@EntityRepository,因为这更复杂,但它有效
希望对您有帮助。 在我的用户服务
constructor(
@InjectRepository(UserEntity)
private readonly repository: BaseRepository<UserEntity>,
) {}
用户模块
@Module({
imports: [TypeOrmModule.forFeature([UserEntity])],
exports: [UserService],
providers: [UserService],
})
export class UserModule {}