【问题标题】:NestJS class-transformer ignoring Declorators on TypeORM-EntityNestJS 类转换器忽略 TypeORM-Entity 上的 Declorators
【发布时间】:2021-10-08 03:50:40
【问题描述】:

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

用户.实体

@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,所以我真的不知道发生了什么。

提前致谢和亲切的问候。

【问题讨论】:

    标签: node.js typescript nestjs typeorm class-transformer


    【解决方案1】:

    您将@Res() 注入到您的路由处理程序中。 Nest 的文档 explicitly state 表明,如果您使用 @Res(),您将自己负责格式化和发送响应。如果您希望 Nest 为您处理响应,请从路由处理程序中删除 @Res(),然后使用 @UseInterceptors(ClassSerializationInterceptor) as described in the docs here

    编辑 8/3/21 回答问题

    抱歉,我读的太快了,没有注意到您确实在自己调用 res.senduserToPlain 方法。

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

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

    【讨论】:

    • 我自己在 userToPlain 中格式化对象,它将类调用为纯文本
    • 抱歉,你是对的。我已经用我的发现和解决方案更新了我的答案
    猜你喜欢
    • 2022-01-21
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多