具有 TypeORM : When using custom repository, 的 NestJS 是否需要服务?

标签 nestjs typeorm

新手问题:
在使用 NestJS 和 TypeORM 时,有人创建了一个自定义存储库(它扩展了标准存储库),是否需要单独的服务类?

目前,我只使用自定义 Repository 类并且它工作正常,但我不确定这是否正确并且可能有一些副作用。

顺便说一句,在另一个项目中,我没有自定义 repo,只有一个注入(inject)两个标准 repo 的服务,这也很好。

问候,
萨杰罗伯特

最佳答案

我认为这取决于您要在 typeORM 和您最“前台”代码(这将是典型的嵌套应用程序中的 Controller )之间添加多少层。
我自己解释:
如果您愿意,您通常可以将内置的 typeORM 存储库直接注入(inject)到您的 Controller 中:

import {Controller, Get} from '@nestjs/common';
import {InjectRepository} from '@nestjs/typeorm';
import {Repository} from 'typeorm';
import {User} from './entities/User.entity';

@Controller()
export class AppController {
    constructor(
        @InjectRepository(User)
        private readonly userRepository: Repository<User>,
    ) {
    }

    @Get()
    async root(): Promise<User> {
        return await this.userRepository.find(1);
    }
}
所以这将是如何检索 ID = 1 的用户的较少分层的实现。
现在,NEST 的文档建议抽象这个存储库并将其注入(inject)到服务中,而不是直接注入(inject)到 Controller 中。这使您可以减少 Controller 和 TypeORM 之间的绑定(bind)。相反,具有此绑定(bind)的是您的服务。如果您有许多使用此存储库的 Controller ,并且您决定要更改 TypeORM 并使用新的精美 ORM,则必须更改每个 Controller 。
现在,如果您只是将存储库注入(inject)到您的服务中并将该服务使用到您的所有 Controller 中,您只需要更改您的服务的实现,所有 Controller 都将保持不变。
其次,假设您想测试您的应用程序。你将面临同样的问题。如何在没有 SQL 连接的情况下运行测试?我想您的单元测试不是为了测试 TypeORM 行为而创建的,而是为了测试您的代码行为而编写的。
模拟注入(inject)服务的存储库比模拟注入(inject) Controller 的所有存储库要容易得多。
所以总结这个答案,我认为这个问题应该被关闭,因为它主要是基于意见的。但是IMO,梦想的架构如下:
  • 创建一个扩展 TypeORM 存储库的自定义存储库。
  • 在自定义存储库中,添加使用查询生成器的方法。
  • 将此自定义存储库注入(inject)您的服务
  • 将服务注入(inject)您的 Controller 。

  • 永远不要在 Controller 中使用查询构建器,因为它很难模拟。
    我希望这能回答您的问题:不需要服务类。但它会帮助你保持你的代码干净。

    关于具有 TypeORM : When using custom repository, 的 NestJS 是否需要服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030009/

    相关文章:

    typescript - 为什么在尝试建立关系时 joinColumns 未定义?

    typescript - 有没有办法从 NestJS 应用程序中收集所有方法及其路径?

    typescript - Nestjs 看不到模块/服务

    javascript - 如何在现有的申请中实现邀请注册?

    typescript - 在 NestJS 中使用与 GraphQL 中的 Input 和 Object 类型相同的类

    typeorm - 找不到Role#users的实体元数据

    node.js - Nestjs 错误 : Cannot find module './app.controller'

    typescript - 使用 NestJS 服务单元测试未找到连接 "default"

    typeorm - TypeScript 项目中的 TypeORM 应该如何配置才能使其在任何地方都能工作?

    node.js - 运行命令 node dist/index.js 会出现与 src 文件夹中的 Typescript 文件相关的错误