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

JDe*_*Dev 9 javascript spring node.js typeorm nestjs

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

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

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

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

BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);

Run Code Online (Sandbox Code Playgroud)

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

tev*_*vek 16

另一个答案中的某人画了这张图,解释了 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另一方面,通过class-transformer使用instanceToPlain和可以完成很多工作plainToClass。使用装饰器 asExposeExclude您可以处理大多数用例。

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