NestJS仅将ClassSerializerInterceptor应用于响应数据

问题描述

我对nestJS中的ClassSerializationInterceptor有疑问。现在,我使用它在返回用户数据时删除密码,例如nestJS文档(https://docs.nestjs.com/techniques/serialization中给出的示例)。当我返回用户时,密码属性将被删除(此部分正在工作)。但是,当我创建一个新用户(并在请求正文中具有password属性)时,请求正文也会被序列化,结果是以下验证管道抱怨缺少密码字段。可以仅将拦截器应用于响应数据吗?

我的控制器方法如下:

@UsePipes(new ValidationPipe({ transform: true })
@UseInterceptors(ClassSerializationInterceptor)
@Post()
async add(@Body() userData: User) {
  return this.userService.addUser(userData)
}

我的用户实体如下:

@Entity()
@Unique['email']
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  email: string;

  @Column()
  @Exclude()
  password: string;
}

代码已简化,但足以重现问题/此行为。

解决方法

巢使用class-transformer来完成。

类转换器通过两种方式进行序列化:

  • 纯类(JSON到Class实例)
  • 从类到普通(从类实例到JSON)

因此,您可以尝试传递toPlainOnly: true来排除装饰器:

@Entity()
@Unique['email']
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  email: string;

  @Column()
  @Exclude({ toPlainOnly: true })
  password: string;
}

Class transformer doc