Nest JS和Typeorm自定义存储库问题

时间:2020-08-22 17:12:49

标签: nestjs typeorm

关于Nestjs中的自定义存储库,我有一个小问题。

当请求进入时(例如针对用户实体),我有以下逻辑。

用于用户请求的控制器->将数据传递给服务->服务执行逻辑和解析->调用自定义存储库以获取基本数据命令(保存,更新,获取等)。

所以我有以下存储库:

@EntityRepository(User)
export class UserRepository extends Repository<User> {
  /**
   * Get a user by id
   * @param id
   */
  async getUserById(id: number): Promise<User> {
    return await this.findOne({
      where: [{ id }],
    });
  }

}

服务看起来像这样:

@Injectable()
export class UserService{
    constructor(
        @InjectRepository(UserRepository)
        private userRepository: UserRepository
    ){
    }

    /**
     * Returns a user object by id
     * @param id
     */
    async getUserById(id: number): Promise<User>{
        return await this.userRepository.getUserById(id);
    }
}

如果有问题,用户模块为:

@Module({
    imports: [
        TypeOrmModule.forFeature([User, UserRepository])
    ],
    controllers: [UserController],
    providers: [UserService],
    exports: [UserService],
})
export class UserModule{
}

但是由于某些原因,当我调用getUserById时,出现以下错误: “ TypeError:无法读取未定义的属性'findOne'”

如果我将存储库功能更改为此,我就能修复它:

return await getRepository(User).findOne({where: [{ id }]})

但是这似乎是一个混乱的解决方案,为什么它不能以原始方式起作用?

预先感谢, 加比。

3 个答案:

答案 0 :(得分:0)

自定义存储库无需注入

@InjectRepository(UserRepository)

您应该删除该行。这可能是您出错的原因。

答案 1 :(得分:0)

尝试这样

@Injectable()
export class UserService{

 constructor(@InjectRepository(User) private userRepository: Repository<User>){}

 /**
 * Returns a user object by id
 * @param id
 */
 async getUserById(id: number): Promise<User>{
    return await this.userRepository.findOne(id);
 }
}

您无需为此用例编写自定义方法,因为findOne方法会在默认情况下解决此问题。

答案 2 :(得分:0)

如果使用自定义存储库,则不需要@InjectRepository。 在将存储库注入服务中时需要@InjectRepository

OS: Microsoft Windows 10 Education Edition
Processor: AMD Ryzen 7 3700X 8-core
Installed Physical Memory (RAM): 16.0 GB

R version: 4.0.2 (2020-06-22) -- "Taking Off Again"
Rstudio version: 1.3.1056