Nest提供了内置功能,可帮助确保可以直接方式执行这些操作。该
ClassSerializerInterceptor
拦截器使用功能强大的类变压器包提供变换对象的声明和可扩展的方式。它执行的基本操作是获取方法处理程序返回的值,并应用class-transformer中的classToPlain()
函数。这样,它可以将装饰器表示的规则应用于实体/ DTO类,如下所述。class-transformer
上面是官方说明,那么暗体为什么要这么做,其实是为了排除掉实体中的一些特殊字段。比如
密码
字段
// users.entity.ts
import {BeforeInsert, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn} from "typeorm";
import {hash} from "bcrypt";
import {Exclude} from "class-transformer";
@Entity()
export default class Users {
@PrimaryGeneratedColumn()
id: number;
@Column('varchar', {unique: true})
name: string;
@Column()
@Exclude()
password: string;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date
@BeforeInsert()
async changePassword(){
this.password = await hash(this.password,12)
}
}
在控制器返回做处理
import {
ClassSerializerInterceptor,
Controller,
Param,
Post,
UseInterceptors
} from '@nestjs/common';
import {UsersService} from "./users.service";
import {UserDto} from "./user.dto";
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get(':id')
@UseInterceptors(ClassSerializerInterceptor)
async show(@Param('id') id:string){
const res = await this.usersService.show(id)
return res;
}
}
网友评论