序列化
序列化(Serialization)是一个在网络响应中返回对象前的过程。 这是一个适合转换和净化要返回给客户的数据的地方。例如,应始终从最终响应中排除敏感数据(如用户密码)。此外,某些属性可能需要额外的转换,比方说,我们只想发送一个实体的子集。手动完成这些转换既枯燥又容易出错,并且不能确定是否覆盖了所有的情况。
Nestjs的序列化
Nest提供了ClassSerializerInterceptor拦截器,他会帮助我们进行序列化.
使用方法
在Controller类上加注解@UseInterceptors(ClassSerializerInterceptor)
@UseInterceptors(ClassSerializerInterceptor)
export class UserController {
}
或者在某个方法上
export class UserController {
@UseInterceptors(ClassSerializerInterceptor)
@Get()
findOne(): UserEntity {
return new UserEntity({
id: 1,
firstName: 'Kamil',
lastName: 'Mysliwiec',
password: 'password',
});
}
}
去除属性
使用@Exclude()去除实体属性
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);
}
}
此时返回值里将没有password属性
显示属性
@Expose()
get fullName(): string {
return `${this.firstName} ${this.lastName}`;
}
此时返回值里将会有新的属性fullName
属性的转换
使用@Transform()
@Transform(role => role.name)
role: RoleEntity;
此时role属性上会显示role.name的值.
此处,还可以进行字符,数字,布尔之间的转换
子类型转换
使用@Type()进行子类型转换
@Type(() => Role)
roles: Role[];
此时roles返回的是Role的集合.如果Role中还有类型转换,此时也会显示转换后的数据.
小结
class-transformer上还有很多其他的功能,大家可以参考文档.以上只是最近在项目中常用的几种