NestJS 仅将 ClassSerializerInterceptor 应用于响应数据
NestJS only apply ClassSerializerInterceptor to response data
我对 NestJS 中的 ClassSerializationInterceptor 有疑问。现在,我在 returning 用户数据时使用它来删除密码,就像 NestJS 文档 (https://docs.nestjs.com/techniques/serialization) 中给出的示例一样。当我 return 一个用户时,密码 属性 被删除(这部分正在工作)。但是,当我创建一个新用户(并且在请求正文中有一个密码 属性 )时,请求正文也会被序列化,结果是以下验证管道抱怨密码字段丢失。是否可以将此拦截器仅应用于响应数据?
我的控制器方法如下所示:
@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;
}
代码已简化,但足以重现 problem/this 行为。
nest 使用 class-transformer 来做到这一点。
Class transformer 以两种方式进行序列化:
- 普通到 class(JSON 到 Class 实例)
- Class 到普通(Class 实例到 JSON)
所以你可以尝试通过 toPlainOnly: true
来排除装饰器:
@Entity()
@Unique['email']
export class User {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
email: string;
@Column()
@Exclude({ toPlainOnly: true })
password: string;
}
我对 NestJS 中的 ClassSerializationInterceptor 有疑问。现在,我在 returning 用户数据时使用它来删除密码,就像 NestJS 文档 (https://docs.nestjs.com/techniques/serialization) 中给出的示例一样。当我 return 一个用户时,密码 属性 被删除(这部分正在工作)。但是,当我创建一个新用户(并且在请求正文中有一个密码 属性 )时,请求正文也会被序列化,结果是以下验证管道抱怨密码字段丢失。是否可以将此拦截器仅应用于响应数据?
我的控制器方法如下所示:
@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;
}
代码已简化,但足以重现 problem/this 行为。
nest 使用 class-transformer 来做到这一点。
Class transformer 以两种方式进行序列化:
- 普通到 class(JSON 到 Class 实例)
- Class 到普通(Class 实例到 JSON)
所以你可以尝试通过 toPlainOnly: true
来排除装饰器:
@Entity()
@Unique['email']
export class User {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
email: string;
@Column()
@Exclude({ toPlainOnly: true })
password: string;
}