排除 typeorm 响应中的选定字段,排除密码字段

问题描述 投票:0回答:1

我有这个 TypeORM 实体:

export class Users extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: bigint

  @Column({ type: 'varchar', length: 32 })
  username: string

  @Column({ type: 'varchar', length: 32 })
  password: string
}

当我使用该方法时:

const data = await Users.find({})

我获取了所有用户的密码。 我想从响应中排除密码字段。

根据文档,我发现可以指定

select
选项,如下所示:

const data = await Users.find({ select: { username: true, password: false } })

这可行,但这只是一个例子。

在我的实际案例中,用户表有超过 26 列。

我不想将

select
选项中的每一列都列为

const data = await Users.find({ select: { 
   username: true, 
   firstName: true,
   lastName: true,
   // ... other 99,999,99+ columns
   // then eventually:
   password: false 
} })

是否有一个更简单的解决方案,我可以简单地执行诸如预取中间件之类的操作,或者定义它应该被排除在架构中?

在 mongoose 中,我曾经在模式本身内部编写

password: { select: false }

我们可以为TypeORM做一些方法吗?

typescript typeorm
1个回答
0
投票

我找到了一个很酷的方法。

$ npm i class-transformer

然后,在您的实体中:

import { Exclude } from 'class-transformer'

export class Users extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: bigint

  @Column({ type: 'varchar', length: 32 })
  username: string

  @Column({ type: 'varchar', length: 32 })
  @Exclude()
  password: string
}

之后,在您的代码中,每当您获取数据时,在将其发送到客户端之前,将返回的 TypeORM 类实例转换为 POJO(计划旧 JavaScript 对象):

import { instanceToPlain } from 'class-transformer'
const data = await Users.find()
const dataPOJO = data.map((user) => instanceToPlain(user))
// now dataPOJO includes everything except the 'password' field. 
© www.soinside.com 2019 - 2024. All rights reserved.