另一个答案中的某人画了这张图,解释了 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
及其使用instanceToPlain
and plainToClass
。使用装饰器作为Expose
and Exclude
您可以处理大多数用例。
如果这还不够,你可以使用类似的东西:https://www.npmjs.com/package/@automapper/nestjs https://www.npmjs.com/package/@automapper/nestjs