首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

序列化

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

概观

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

排除属性

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

代码语言:javascript
复制
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);
  }
}

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

代码语言:javascript
复制
@UseInterceptors(ClassSerializerInterceptor)
@Get()
findOne(): UserEntity {
  return new UserEntity({
    id: 1,
    firstName: 'Kamil',
    lastName: 'Mysliwiec',
    password: 'password',
  });
}

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

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

代码语言:javascript
复制
{
  "id": 1,
  "firstName": "Kamil",
  "lastName": "Mysliwiec"
}

公开属性

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

代码语言:javascript
复制
@Expose()
get fullName(): string {
  return `${this.firstName} ${this.lastName}`;
}

转变

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

代码语言:javascript
复制
@Transform(role => role.name)
role: RoleEntity;

通过选项

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

代码语言:javascript
复制
@SerializeOptions({
  excludePrefixes: ['_'],
})
@Get()
findOne(): UserEntity {
  return {};
}

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

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

Websockets和微服务

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

扫码关注腾讯云开发者

领取腾讯云代金券