【问题标题】:NestJS, how and where to build response DTOsNestJS,如何以及在哪里构建响应 DTO
【发布时间】:2022-10-18 04:15:25
【问题描述】:

我一直在使用 Java Spring 框架来开发微服务。最近我开始探索 NestJS 并有一个关于构建响应 DTO 的问题。

在春天, 控制器是轻量级的,它们将调用移交给服务层。

服务层实现业务逻辑,最后,他们调用负责构建响应 DTO 的 Mapper 类。映射器类可能就像将实体克隆到 DTO 一样简单,也可能使用多个 DB 实体对象构建复杂的对象。

在 NestJS 中,大多数示例都使用了 class-transformer。但我不确定class-transformer 是否足以构建复杂的对象。对我来说class-transformer 基本上是在克隆对象。在 Spring 中的等价物是

BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);

所以我的问题是在 NestJS 中,哪个层负责构建复杂的响应对象?将实体对象发送到控制器是一种好习惯吗?

【问题讨论】:

    标签: javascript node.js spring nestjs typeorm


    【解决方案1】:

    另一个答案中的某个人画了这张图,它解释了 NestJS 中请求的生命周期(向那个人大喊):

    回答您的问题:what layer is responsible for building complex response objects? 好吧,我说拦截器是处理请求的最后一点逻辑,但我猜您要问的是“实体在哪里转换自动地到 DTO?”这将解释您的第二个问题:Is sending Entity object to Controller a good practice?

    简短的回答:这取决于。 长答案:DTO 对于将您的请求逻辑与您的服务逻辑分离非常有用,有些值您可能不希望用户知道并将它们填充到您的逻辑中......因此,使用它是一个好习惯他们。但实际上,想想你的项目,它的规模以及你想要完成的事情,特别是现在你必须处理这种转换。

    也就是说,关于实体和 DTO 之间的转换。您可以做的一件事是在参数之间进行完全手动设置:

    export class UserDTO {
        id: string;
    
        name: string;
    
        surname: string;
    
        toEntity(dto:UserDTO) {
            const model = new User();    
            model.id = id;
            model.fullname = `${dto.name}, ${dto.surname}`
            return model;
        }
    
        fromEntity(entity:User) {
            const dto = new UserDTO();
            dto.id = entity.id;
    
            const [ name, surname ] = entity.(fullname as string).split(', ').map((name) => {name.tirm()});
            dto.name = name,
            dto.surname = surname;
        }
    }
    

    另一方面,可以通过class-transformer 及其对instanceToPlainplainToClass 的使用来完成很多工作。通过将装饰器用作ExposeExclude,您可以处理大多数用例。

    如果这还不够,您可以使用类似:https://www.npmjs.com/package/@automapper/nestjs

    【讨论】:

      【解决方案2】:

      Nestjs 为 DTO 提供了 PartialType()、PickType()、OmitType() 等辅助方法,你可能想在这里阅读:https://docs.nestjs.com/techniques/validation#stripping-properties

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 2019-04-27
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2019-06-30
        相关资源
        最近更新 更多