序列化
序列化
在发送实际响应之前,Serializers为数据操作
提供了干净的抽象层。例如,应始终从最终响应中排除敏感数据(如用户密码)。此外,某些属性可能需要额外的转换,比方说,我们不想发送整个数据库实体。相反,我们只想选择id
和name
。其余部分应自动剥离。不幸的是,手动映射所有实体可能会带来很多困惑。
概观
为了提供一种直接的方式来执行这些操作,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和微服务。