Serializer 提供了在返回响应之前的数据处理功能。比如像用户密码这种敏感数据不应该包含在响应里。一些属性可能需要转换一下。响应的实体数据可以只包含指定的属性,比如 id 还有 name。
Nest 提供的 ClassSerializerInterceptor 可以帮我们做这些事情,它用了 class-transformer 包提供的功能。ClassSerializerInterceptor 拿到方法返回的值以后会交给 class-transformer 包里提供的 classToPlain 方法。
排除属性
比如在实体里排除 password 属性:
import { Exclude } from 'class-transformer'; export class UserEntity { id: number; firstName: string; lastName: string; @Exclude() password: string; }
使用:
@UseInterceptors(ClassSerializerInterceptor) @Get() findOne(): UserEntity {}
返回的结果里面不会包含 password 属性。
Expose 属性
使用 @Expose 装饰器,提前处理一些属性。
@Expose() get fullName(): string { return `${this.firstName} ${this.lastName}`; }
转换
使用 @Transform() 装饰器可以转换数据。比如一个 RoleEntity,你只需要它的 name 属性:
@Transform(role => role.name) role: RoleEntity;
选项
转换选项可能会根据一些特定的情况有一些变化,覆盖默认的设置,可以使用 @SerializeOptions() 装饰器。
@SerializeOptions({ excludePrefixes: ['_'], }) @Get() findOne(): UserEntity {}
这些选项会作为 classToPlain() 函数的第二个参数值。