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。使用装饰器 asExpose和Exclude您可以处理大多数用例。
如果这还不够,您可以使用类似的东西:https ://www.npmjs.com/package/@automapper/nestjs
| 归档时间: |
|
| 查看次数: |
17333 次 |
| 最近记录: |