Nest js 和 typeorm 自定义存储库问题

Posted

技术标签:

【中文标题】Nest js 和 typeorm 自定义存储库问题【英文标题】:Nest js and typeorm custom repository issue 【发布时间】:2020-12-11 18:58:44 【问题描述】:

我有一个关于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 ])

但这似乎是一个混乱的解决方案,任何想法为什么它不能以原始方式工作?

提前致谢, 加比。

【问题讨论】:

问题解决了吗? 不.. 还是一样的问题 请阅读此处的链接。 github.com/typeorm/typeorm/issues/7370#issuecomment-778698027我用 OP 建议解决了我的问题 【参考方案1】:

自定义仓库不需要注入

@InjectRepository(UserRepository)

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

【讨论】:

【参考方案2】:

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

constructor(
@InjectRepository(User)
private userService:Repository<User>)

【讨论】:

以上是关于Nest js 和 typeorm 自定义存储库问题的主要内容,如果未能解决你的问题,请参考以下文章

nest.js + typeORM:基本使用

如何在 typeorm 和 nest.js 中设置布尔验证

Nest.js + TypeORM + OpenApi 中虚拟(计算)列的最佳实践

nest.js + typeORM:身份认证,事务管理

Nest.js TypeORM 连接到本地数据库(在 docker 容器上)

在 Nest JS / TypeORM 中使用具有关系的实体内部的实体并填充数据库