首页 > 解决方案 > NestJS 仅将 ClassSerializerInterceptor 应用于响应数据

问题描述

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

我的控制器方法如下所示:

@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;
}

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

标签: typescriptexpressserializationnestjsinterceptor

解决方案


巢使用类变压器来做到这一点。

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

  • 普通到类(JSON 到类实例)
  • 类到普通(类实例到 JSON)

所以你可以尝试通过toPlainOnly: true排除装饰器:

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

  @Column()
  email: string;

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

类变压器文档


推荐阅读