0

我尝试添加toJSON(){return classtoPlain(this)}我的实体仍然无法正常工作。这是我的控制器

@Controller('users')
@UseInterceptors(ClassSerializerInterceptor)
export class UsersController {
  constructor(private readonly usersService: UsersService) {}
  @HttpCode(200)
  @Post()
  async create(@Body() user: User): Promise<User> {
    return await this.usersService.create(user).catch((err) => {
      throw new HttpException({ message: err.message }, HttpStatus.BAD_REQUEST);
    });
  }

这是我的实体

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
import { Gender } from '../Constants/enum';
import { Exclude, instanceToPlain } from 'class-transformer';

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

  @Column()
  firstName: string;

  @Column()
  lastName?: string;

  @Column({
    type: 'enum',
    enum: Gender,
  })
  gender: Gender;

  @Column({ unique: true })
  email: string;

  @Column()
  @Exclude({ toPlainOnly: true })
  password: string;

  constructor(partial: Partial<User>) {
    Object.assign(this, partial);
  }
  toJSON() {
    return instanceToPlain(this);
  }
}

这是我的服务

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { UpdateUserDto } from './dto/update-user.dto';
import { User } from './entities/user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly user_detailsRepository: Repository<User>,
  ) {}
  create(user: User) {
    return this.user_detailsRepository.save(user);
  }

我尝试了很多解决方案,但仍然没有任何效果。对于 GET 它的工作,但对于发布它的显示密码字段。如果有人可以提供任何解决方案,那就太好了。

4

1 回答 1

0

您在实体定义/验证之间混合,哪个 typeORM 函数/装饰器(在您的情况下)应该处理。和 DTO 定义,应该处理哪个类转换器/验证器

所以你应该定义一个createUserDTO.ts像下面这样的文件,并在控制器/服务文件中使用它:

export class createUserDTO {
  @IsNotEmpty()
  @IsString()
  firstName: string;

  @IsNotEmpty()
  @IsString()
  lastName?: string;

  @IsNotEmpty()
  @IsEnum(Gender)
  gender: Gender;

  @IsNotEmpty()
  email: string;

  @Exclude({ toPlainOnly: true })
  password: string;

}

实体文件不应有密码列(完全省略该字段),应如下所示:

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

  @Column()
  firstName: string;

  @Column()
  lastName?: string;

  @Column({
    type: 'enum',
    enum: Gender,
  })
  gender: Gender;

  @Column({ unique: true })
  email: string;
}

然后,当您致电时return this.user_detailsRepository.save(userDto);,它应该可以正常工作

于 2022-01-23T09:27:45.560 回答