关于 ClassSerializerInterceptor 和 自定义的 SerializerInterceptor 的区别
来源:11-17 拦截器进阶(序列化):敏感数据如何处理?

守望星辰的旅人
2024-11-26
老师,在学习11-17节课程时我有一些疑问,希望请教一下老师:
- Nestjs 官方提供的
ClassSerializerInterceptor
和 课程中自定义的SerializerInterceptor
这两个拦截器功能似乎重复了,是不是实际项目中只需要使用其中一个就可以了?并且 自定义的SerializerInterceptor
是相比于内置的ClassSerializerInterceptor
更符合实际需求的最佳实践? - 内置的
ClassSerializerInterceptor
不像我们自定义的SerializerInterceptor
支持传参数,那它具体是依据什么类来进行序列化的?是默认针对Entity
进行序列化吗? - 对于内置的
ClassSerializerInterceptor
,我尝试不返回User
实体而是直接返回一个JSON
,此时序列化失效。而如果返回包含该实体的包装对象,则可以进行序列化,这是什么原因?
@Post("signup")
@UseInterceptors(ClassSerializerInterceptor)
async signsignupin(@Body() dto: SigninUserDto) {
const { username, password } = dto;
if (!username || !password) {
throw new HttpException("用户名或密码不能为空", 400);
}
if (!username || !password) {
throw new HttpException("用户名或密码不能为空", 400);
}
const res = await this.authService.signup(username, password);
// 这种方式可以序列化
return {
data: res,
};
// 如果返回的是一个普通对象则无法序列化
return { ...res }
}
ClassSerializerInterceptor
能否对自定义的 DTO 进行序列化,代码如何实现?
class signUpDto {
@Expose()
username: string;
}
@Post("signup")
@UseInterceptors(ClassSerializerInterceptor)
async signsignupin(@Body() dto: SigninUserDto) {
const { username, password } = dto;
if (!username || !password) {
throw new HttpException("用户名或密码不能为空", 400);
}
if (!username || !password) {
throw new HttpException("用户名或密码不能为空", 400);
}
const res = await this.authService.signup(username, password);
// res的类型强制转换为DTO之后,ClassSerializerInterceptor读取的依然是 User 这个 Entity 类
// 如何让 ClassSerializerInterceptor 对自定义的 DTO进行处理,而不是处理 Entity
return res as signUpDto;
}
写回答
1回答
-
Brian
2024-11-28
不是,我们相当于是对ClassSerializerInterceptor进一步的封装;
那它具体是依据什么类来进行序列化的?——根据Entity 是默认针对
Entity
进行序列化吗?——对的。按理说,应该与你的这里的SigninUserDto定义的比如expose属性对应,如果无法序列化,请检查全局class-transfomer的设定,比如是否设定了,默认的expose属性。
你问的这个问题不就是课程中实现的吗?哈哈
00
相似问题