시리얼 라이저는 실제 응답을 보내기 전에 데이터 조작에 대한 깨끗한 추상화 계층을 제공합니다. 예를 들어, 사용자 비밀번호와 같은 민감한 데이터는 항상 최종 응답에서 제외해야 합니다. 또한 특정 속성에는 추가 변환이 필요할 수 있습니다. 예를 들어 전체 데이터베이스 엔터티를 보내지 않으려는 경우를 가정해 보겠습니다. 대신, 우리는 id
와 name
만 고르고 싶습니다. 나머지는 자동으로 제거해야합니다. 불행히도 모든 엔티티를 수동으로 매핑하면 많은 혼란이 생길 수 있습니다.
Nest는 이러한 작업을 수행하는 간단한 방법을 제공하기 위해 ClassSerializerInterceptor
클래스를 제공합니다. class-transformer
패키지를 사용하여 선언적이고 확장 가능한 객체 변환 방법을 제공합니다. 기본적으로 ClassSerializerInterceptor
는 메소드에서 리턴된 값을 가져 와서 class-transformer
패키지에서 serializclassToPlain()
함수를 호출합니다.
다음 엔터티에서 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);
}
}
그런 다음 컨트롤러의 메소드에서 이 클래스의 인스턴스를 직접 리턴하십시오.
꼭 클래스의 인스턴스를 반환해야 합니다.
JavaScript 객체를 반환하면 { user: new UserEntity() }
객체가 제대로 직렬화되지 않습니다.
@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()데코레이터를 사용하십시오. ( getter 함수와 유사).
// user.entity.ts에 추가
@Expose()
get fullName(): string {
return `${this.firstName} ${this.lastName}`;
}
@Expose 데코레이터는 class-transformer 패키지에서 가져옵니다.
이 때, Expose로 정의한 값도 같이 retrun합니다.
// 변경된 값
{
"id": 1,
"firstName": "Kamil",
"lastName": "Mysliwiec",
"fullName": "Kamil Mysliwiec"
}
@Transform()
데코레이터를 사용하여 추가 데이터 변환을 수행할 수 있습니다.
예를 들어, 전체 객체를 반환하는 대신 RoleEntity
의 이름을 선택하려고합니다.
@Transform(({ value }) => value.name)
role: RoleEntity;
변형 옵션은 특정 요인에 따라 달라질 수 있습니다. 기본 설정을 덮어 쓰려면 @SerializeOptions()
데코레이터를 사용하십시오.
@SerializeOptions({
excludePrefixes: ['_'],
})
@Get()
findOne(): UserEntity {
return new UserEntity();
}
@SerializeOptions() 데코레이터는 @nestjs/common 패키지에서 가져옵니다.
전달된 옵션은 @SerializeOptions()
의 instanceToPlain()
함수의 두 번째 인수로 전달됩니다.
이 예에서는 _
접두사로 시작하는 모든 속성을 자동으로 제외합니다
이 장에서는 HTTP 스타일 애플리케이션(예: Express 또는 Fastify)을 사용하는 예제를 보여 주지만 ClassSerializerInterceptor
사용되는 전송 방법에 관계없이 WebSocket 및 Microservices에 대해 동일하게 작동합니다.