Nestjs 序列化(Serialization)

136 阅读1分钟

序列化(Serialization)是一个在网络响应中返回对象前的过程。 这是一个适合转换和净化要返回给客户的数据的地方。例如,应始终从最终响应中排除敏感数据(如用户密码)。此外,某些属性可能需要额外的转换,比方说,我们只想发送一个实体的子集。手动完成这些转换既枯燥又容易出错,并且不能确定是否覆盖了所有的情况。

安装

npm install class-transformer
npm install typeorm

排除、暴露、转换等属性

cats.entity.ts

import { PrimaryGeneratedColumn, Column, Entity } from 'typeorm';
import { Exclude, Expose } from 'class-transformer';

@Entity()
export class Cats {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 45 })
  name: string;

  @Exclude()  // 排除掉该字段
  @Column('int')
  age: number;

  @Expose()
  get hello(): string {
    return `hello ${this.name}.`; // 暴露出一个计算属性
  }

  @Transform(role => role.name); //转换:返回name名称,而不是返回整个RoleEntity对象
  role: RoleEntity;

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

在控制器返回时做处理

import { ClassSerializerInterceptor, Controller, Get, UseInterceptors } from '@nestjs/common';
import { CatsService } from './cats.service';
import { Cats } from './cats.entity';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @UseInterceptors(ClassSerializerInterceptor)
  @Get()
  getHello() :Cats[]{
    return (this.catsService.findAll()).map(el => new Cats(el));
  }
}

cats.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {
  findAll() {
    return [{id:123,name:'leolee',age:45},{id:1231,name:'leolee1',age:451}];
  }
}