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

9

我一直在使用Java Spring框架开发微服务。最近,我开始探索NestJS,并对构建响应DTOs有疑问。

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

服务层实现业务逻辑,并最终调用Mapper类来构建响应DTOs。 Mapper类可能只是将实体克隆到DTO,也可能使用多个DB实体对象构建复杂对象。

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

BeanUtils.copyProperties(workingWellCompositeMemberContactTrace, workingWellDailyMemberAggEntity);

在NestJS中,负责构建复杂响应对象的层是什么?将实体对象发送给控制器是一个好的做法吗?

2个回答

15

有人在另一个答案中画了这张图,解释了NestJS中请求的生命周期(向那个人致敬):

图片描述

回答你的问题:哪一层负责构建复杂的响应对象? 我认为拦截器是处理请求的最后一部分逻辑,但我猜你想问的是“实体何时自动转换为DTO?”这将解释你的第二个问题:将实体对象发送到控制器是一个好习惯吗?

简短回答:取决于具体情况。 长回答: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的东西。


发送实体作为响应的问题是:当像Swagger这样的文档在浏览器上呈现文档时,由于一些循环依赖或相关实体,响应负载变得过大,导致Swagger UI进入非响应模式 - 也许我离题了,但我支持发送ResponseDTOs作为响应。 - undefined

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接