0

我正在尝试在 NestJS 项目中的 TypeORM-Entity 上使用 classToPlain,而类 Transformer 只是忽略了 @Exclude Declorator。以下是我的一些代码片段:

用户实体

@Entity()
export class User {
  @Column()
  @Exclude()
  password!: string;
}

export const userToPlain = (user : User) => {
  return classToPlain<User>(user);
}

用户服务

  createUser(userDTO : userCreateDTO, role?: RoleType[]) : Promise<User> {
    return new Promise<User>(async (resolve, reject) => 
      this.usersRepository.save(userDTO).then(res => {
        resolve(res);
      }).catch(reject);
    })
  }

users.controller

@Post("/create")
create(@Body() userDto : userCreateDTO, @Req() request: Request, @Res() res: Response) {
      this.userService.createUser(userDto, ["EDITOR"]).then(newUser => {
        res.status(201);
        res.json(userToPlain(newUser));
      })
  })
}

我以前既没有使用过 NestJS、TypeORM,也没有使用过 class-transformer,所以我真的不知道发生了什么。

提前致谢和亲切的问候。

4

1 回答 1

1

您正在注入@Res()您的路由处理程序。Nest 的文档明确指出,如果您使用,@Res()您将自己负责格式化和发送响应。如果您希望 Nest 为您处理响应,请@Res()从路由处理程序中删除,并@UseInterceptors(ClassSerializationInterceptor) 按照此处文档中的说明使用

编辑 21 年 8 月 3 日回答问题

抱歉,我读的太快了,没有注意到你确实在打电话res.senduserToPlain自己的方法。

所以,TypeORM 的 save 方法有点奇怪,因为它只返回一个对象,而不是一个类实例,所以没有关于该classToPlain方法的元数据要读取,因此,它按原样返回对象。您可以通过记录自己验证这一点newUser instanceof User

你可以做的是plainToClass首先调用,这样你就可以得到一个User类的实际实例,然后可以在userToPlain方法中正确地序列化它。你可以把它放在你的useToClass方法中,或者让它成为UserService#createUser

于 2021-08-02T21:16:23.017 回答