Sequelize:获取器, 设置器 虚拟字段
Sequelize 允许为模型属性定义自定义获取器(Getter) 和设置器(Setter),还支持创建虚拟字段(Virtual Field)。虚拟字段仅存在于模型层,不在数据库表中实际存储,可简化自定义属性逻辑,提升代码简洁性。
获取器(Getter)
定义与作用:为模型属性定义get()函数,读取属性值时自动调用,用于对原始数据进行加工后返回(不修改数据库存储值)。需通过this.getDataValue(‘属性名’)获取原始值,避免直接使用this.属性名导致无限循环。
const User = sequelize.define('user', {username: {type: DataTypes.STRING,get() {const rawValue = this.getDataValue('username');return rawValue ? rawValue.toUpperCase() : null; // 转为大写后返回}}
});
读取时返回加工后的值:user.username 输出 SUPERUSER123(原始值 SuperUser123 仍存于数据库)。可通过 user.getDataValue(‘username’) 查看未加工的原始值。
设置器(Setter)
定义与作用:为模型属性定义set(value)函数,设置属性值时自动调用,用于对输入值加工后存储(数据库仅存加工后的数据)。支持结合模型其他字段进行计算(如用用户名作为密码哈希的盐)。
const User = sequelize.define('user', {password: {type: DataTypes.STRING,set(value) {// 对密码进行哈希处理(示例,实际需用安全哈希算法)this.setDataValue('password', hash(value));}}
});
const User = sequelize.define('user', {username: DataTypes.STRING,password: {type: DataTypes.STRING,set(value) {// 用用户名+密码拼接后哈希this.setDataValue('password', hash(this.username + value));}}
});
● 文档明确:示例中的密码处理仅演示功能,实际需参考 OWASP 文档或咨询安全专家,确保密码存储安全。
虚拟字段(Virtual Field)
定义与作用:使用 DataTypes.VIRTUAL 定义,不在数据库表中创建列,仅在模型层通过自定义逻辑生成值。支持定义get()(计算返回值)和set()(通常用于禁止设置,抛出错误)。
const User = sequelize.define('user', {firstName: DataTypes.TEXT,lastName: DataTypes.TEXT,fullName: {type: DataTypes.VIRTUAL,get() {return `${this.firstName} ${this.lastName}`; // 拼接姓名},set(value) {throw new Error('不要尝试设置 `fullName` 的值!'); // 禁止设置}}
});
创建用户后,user.fullName 自动返回拼接后的全名(如 John Doe),数据库无 fullName 列。
