NestJS,如何以及在何处构建响应 DTO

NestJS, how and where to build response DTOs

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

在Spring中, controller是轻量级的,他们把调用交给了Service Layer。

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

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

BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);

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

另一个答案中有人画了这张图,解释了 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