我有这个 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做一些方法吗?
我找到了一个很酷的方法。
$ 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.