NodeJS 如何在NestJS 9(TypeORM 3.+)中扩展TypeORM仓库

vof42yt1  于 2023-02-08  发布在  Node.js
关注(0)|答案(4)|浏览(328)

以前,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) {}
}

但是从3.0.0版本开始,TypeORM就不支持通过继承进行仓库扩展。
如何在NestJS 9(依赖于TypeORM 3.+)中实现这样的行为?我想到的唯一解决方案是在服务层添加自定义方法。但我希望将所有与ORM相关的方法(查询、聚合等)保留在存储库层。

5sxhfpxr

5sxhfpxr1#

让我直接告诉你:我不知道这是否是一个推荐的解决方案,我不知道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"只是为了让您知道。
我会继续检查,如果它没有打破任何东西,但现在,似乎是一个很好的变通办法。

zpf6vheq

zpf6vheq2#

希望对您有所帮助。在我的用户服务

constructor(
    @InjectRepository(UserEntity)
    private readonly repository: BaseRepository<UserEntity>,
) {}

用户模块

@Module({
  imports: [TypeOrmModule.forFeature([UserEntity])],
  exports: [UserService],
  providers: [UserService],
})
export class UserModule {}
yeotifhr

yeotifhr3#

这个问题在这里解决(类似于这里的其他答案,但更完整):How to do custom repository using TypeORM (MongoDB) in NestJS?
不知道他们为什么不赞成@EntityRepository,因为这更复杂,但它可以工作

mccptt67

mccptt674#

希望对您有所帮助:

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(dataSource: DataSource) {
    super(User, dataSource);
  }
}
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,
  ) {}
}

相关问题