序列化

序列化

在发送实际响应之前,Serializers为数据操作提供了干净的抽象层。例如,应始终从最终响应中排除敏感数据(如用户密码)。此外,某些属性可能需要额外的转换,比方说,我们不想发送整个数据库实体。相反,我们只想选择idname。其余部分应自动剥离。不幸的是,手动映射所有实体可能会带来很多困惑。

概观

为了提供一种直接的方式来执行这些操作,Nest附带了这个ClassSerializerInterceptor类。它使用类转换器包来提供转换对象的声明性和可扩展方式。基本上,从类变换器包中ClassSerializerInterceptor获取方法和调用classToPlain()函数返回的值。

排除属性

假设我们想要password从以下实体中自动排除属性:

import { Exclude } from 'class-transformer'; export class UserEntity { id: number; firstName: string; lastName: string; @Exclude() password: string; constructor(partial: Partial<UserEntity>) { Object.assign(this, partial } }

然后,直接从控制器的方法返回此类的实例。

@UseInterceptors(ClassSerializerInterceptor) @Get() findOne(): UserEntity { return new UserEntity{ id: 1, firstName: 'Kamil', lastName: 'Mysliwiec', password: 'password', } }

提示ClassSerializerInterceptor是从进口@nestjs/common包。

现在,当您调用此端点时,您将收到以下响应:

{ "id": 1, "firstName": "Kamil", "lastName": "Mysliwiec" }

公开属性

如果要暴露早期预先计算的属性,只需使用@Expose()装饰器即可。

@Expose() get fullName(): string { return `${this.firstName} ${this.lastName}`; }

转变

您可以使用@Transform()装饰器执行其他数据转换。例如,您要选择一个名称RoleEntity而不是返回整个对象。

@Transform(role => role.name) role: RoleEntity;

通过选项

变换选项可能因某些因素而异。要覆盖默认设置,请使用@SerializeOptions()装饰器。

@SerializeOptions{ excludePrefixes: ['_'], }) @Get() findOne(): UserEntity { return {}; }

提示@SerializeOptions()装饰器从进口@nestjs/common包。

这些opions将作为classToPlain()函数的第二个参数传递。

Websockets和微服务

无论使用何种传输方法,所有这些指南都包括WebSockets和微服务。