Nestjs序列化返回值

1,912 阅读1分钟

序列化

序列化(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上还有很多其他的功能,大家可以参考文档.以上只是最近在项目中常用的几种

参考