使用class-transformer进行返回参数拦截中的js对象处理

官方文档:https://docs.nestjs.com/techniques/serialization

一般的按照官方说明进行使用并不会有什么问题,但是涉及到对象嵌套的情况,则会有一些小坑

例如,有如下两个entity:

/**role.ts*/
export class RoleEntity {
  id: number;
  name: string;

  constructor(partial: Partial<RoleEntity>) {
    Object.assign(this, partial);
  }
}
/** user.ts*/
import { Exclude, Expose, Transform } from 'class-transformer';
import { RoleEntity } from './role';

export class UserEntity {

  id: number;
  firstName: string;
  lastName: string;

  @Exclude()
  password: string;

  @Expose()
  role: RoleEntity;

  constructor(partial: Partial<UserEntity>) {
    Object.assign(this, partial);
  }
}

调用方法如下:

@Get('test')
  @Get()
  @SerializeOptions({
    strategy: 'excludeAll',
  })
  @UseInterceptors(ClassSerializerInterceptor)
  findOne(): UserEntity {
    return new UserEntity({
      id: 1,
      firstName: 'Kamil',
      lastName: 'Mysliwiec',
      password: 'password',
      role: new RoleEntity({ id: 1, name: 'admin' }),
    });
  }

此时,是无法返回role属性的,因为RoleEntity中并未对其属性进行Expose,即使UserEntity中对role进行了暴露,最终也只是会返回{}而已。所以,需要对RoleEntity中的属性进行Expose设置,才会返回user.role中的属性key与value。像这样:

/**role.ts*/
export class RoleEntity {
  @Expose()
  id: number;

  @Expose()
  name: string;

  constructor(partial: Partial<RoleEntity>) {
    Object.assign(this, partial);
  }
}

此外,对象必须是类的实例,也就是必须是通过构造方法创建的对象。以下两个对象是不同的:

class User {
  name: string
}
const user1 = new User({name: 'zz'});
const user2 = {name: 'zz'}
posted @ 2021-03-11 15:21  Mr_Kahn  阅读(1067)  评论(0)    收藏  举报