在TypeORM中,可以使用getter和setter方法来实现对实体属性的封装,这样既可以保护属性的私有性,又可以在读取或者设置属性时执行一些特定的逻辑。下面我将通过一个简单的例子来展示如何在TypeORM中使用getter和setter。
假设我们有一个名为User
的实体,它有一个私有的password
属性,我们想要确保每当设置新密码时,密码都会被自动地加密,同时能够保持密码的原文不被直接访问。
typescriptimport { Entity, PrimaryGeneratedColumn, Column, BeforeInsert } from "typeorm"; import * as bcrypt from 'bcryptjs'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column({ type: 'varchar', length: 255 }) private _password: string; // Other properties and columns... constructor(password: string) { this.password = password; } // 使用setter来确保当设置密码时,密码会被加密 set password(password: string) { const salt = bcrypt.genSaltSync(); this._password = bcrypt.hashSync(password, salt); } // 使用getter来获取加密后的密码 get password(): string { return this._password; } // 可以添加一个方法来验证密码 checkPassword(unencryptedPassword: string): boolean { return bcrypt.compareSync(unencryptedPassword, this._password); } // 确保在插入数据前密码被加密 @BeforeInsert() encryptPassword() { const salt = bcrypt.genSaltSync(); this._password = bcrypt.hashSync(this._password, salt); } }
在以上的例子中,User
实体有一个私有的_password
属性,它在数据库中对应于一个列。我们通过定义一个set password()
方法来设置该私有属性,这个方法会在用户设置密码时自动将明文密码转换为加密后的形式。同时,我们也定义了一个get password()
方法来读取加密后的密码。
我们还定义了一个checkPassword()
方法,它接受一个未加密的密码作为参数,并将其与存储在数据库中的加密密码进行比较,以验证密码是否正确。
最后,我们使用了@BeforeInsert()
装饰器来标记encryptPassword()
方法,以确保在将用户实体插入数据库之前,密码将被自动加密。这是TypeORM生命周期钩子的一个例子,它可以在某个操作(例如插入)发生前自动执行。
需要注意的是,getter和setter本身并不会对数据库操作产生直接影响,它们只是实体类的一部分,用于处理类实例属性的读取和赋值。数据库的插入和更新操作由TypeORM的其他部分来处理。
2024年6月29日 12:07 回复