Nestjs 序列化(Serialization)

2020-04-21  本文已影响0人  yanmingfei

官方文档

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;
    }
}
上一篇下一篇

猜你喜欢

热点阅读