关于 ClassSerializerInterceptor 和 自定义的 SerializerInterceptor 的区别

来源:11-17 拦截器进阶(序列化):敏感数据如何处理?

守望星辰的旅人

2024-11-26

老师,在学习11-17节课程时我有一些疑问,希望请教一下老师:

  1. Nestjs 官方提供的 ClassSerializerInterceptor 和 课程中自定义的 SerializerInterceptor 这两个拦截器功能似乎重复了,是不是实际项目中只需要使用其中一个就可以了?并且 自定义的 SerializerInterceptor 是相比于内置的 ClassSerializerInterceptor 更符合实际需求的最佳实践?
  2. 内置的 ClassSerializerInterceptor 不像我们自定义的 SerializerInterceptor 支持传参数,那它具体是依据什么类来进行序列化的?是默认针对 Entity 进行序列化吗?
  3. 对于内置的 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 }
  }
  1. 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

  1. 不是,我们相当于是对ClassSerializerInterceptor进一步的封装;

  2. 那它具体是依据什么类来进行序列化的?——根据Entity 是默认针对 Entity 进行序列化吗?——对的。

  3. 按理说,应该与你的这里的SigninUserDto定义的比如expose属性对应,如果无法序列化,请检查全局class-transfomer的设定,比如是否设定了,默认的expose属性。

  4. 你问的这个问题不就是课程中实现的吗?哈哈

0
0

NestJS 入门到实战 前端必学服务端新趋势

近几年快速发展的Node.js框架,掌握未来前端工程师后端开发能力

569 学习 · 238 问题

查看课程