如何向 NestJS 中的实体添加其他属性?

How can I add additional properties to an entity in NestJS?

我正在使用 NestJS 构建一个 api,到目前为止一切正常!

我有一个 users table 和一个相应的 users.entity.ts 文件:

@Entity({ name: 'users' })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

我正在使用 AWS Cognito 作为身份验证提供程序 - 那里的一切也都运行良好。我尽量不重复东西,所以我想用 Cognito 保留 given_namefamily_name 值,并且我的 postgres table.

上没有冗余字段

我可以毫无问题地获取用户,但我不确定如何将它们“组合”到我的 user 实体中。

例如,

// users.service.ts

const user = await this.usersRepository.findOne({
      where: {
        id: userId,
      },
    });


// id: dbc92...
// email: example@email.com

const cognitoUser = await this.cognitoService.adminGetUser(user.id);

// id: dbc92...
// email: example@email.com
// given_name: "Tony"
// family_name: "Stark"

return user;

我的 user 实体上没有 given_name 属性——我不确定我是否 需要 一个?

理想情况下,我想我想做的是,

user.givenName = cognitoUser.given_name
user.familyName = cognitoUser.family_name
...

return user

但是因为我的 user.entity 文件没有 givenName 属性,所以我不太乐意这样做。

我知道我可以使用扩展运算符“合并”这两个对象,但如果可能的话,我想 return 实际的 user 实体。我怎样才能从两个来源中提取 return 正确的实体?

您可以在不添加 @Column 装饰器的情况下添加所需的属性。它不会在您的 table 中创建列,但您的实体中仍然有它们。

正如 Mohammad 所说,如果您想要完成的是:

user.givenName = cognitoUser.given_name
user.familyName = cognitoUser.family_name

那么你可以这样做:

@Entity({ name: 'users' })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

并且能够仅处理来自 User 的数据,而无需在数据库中复制具有不必要列的数据。