sequelize官方文档地址:设置器和获取器
在上一篇egg(三)中,我有提到获取器和设置器的用法,我觉得还是独立出来方便以后复习查找。
获取器
通过属性获取器对某个查询到的属性进行处理后返回
- 场景:当我获取某条数据,我希望该数据的createdAt返回的是一个时间戳而不是格式。
/app/model/user.js 目录文件下定义的模型
'use strict'
module.exports = app =>{
const {STRING,INTEGER,DATE,ENUM} = app.Sequelize
// 配置(重要:一定要配置详细,一定!!!)
const User = app.model.define('user',{
id:{
type:INTEGER(20).UNSIGNED,
primaryKey:true,
autoIncrement:true,
},
username:{
type:STRING(30),
allowNull:false,
defaultValue:'',
comment:'用户名',
unique:true
},
password:{
type:STRING(200),
allowNull:false,
defaultValue:'',
// set修改器
set(val){
// 新增字段的setter,新增和更新时使用
// this.setDataValue('password') // 设置原始值
this.setDataValue('password',val+'-crypto')
}
},
avatar_url:{
type:STRING(200),
allowNull:true,
defaultValue:''
},
sex:{
type:ENUM,
values:['男','女','保密'],
allowNull:true,
defaultValue:'男',
comment:'用户性别',
},
// created_at:DATE,
// 改写成
created_at:{
type:DATE,
get(){
// 通过get()获取器拿到该字段的值并转换成时间戳
const val = this.getDataValue('created_at')
return (new Date(val).getTime())
}
}
updated_at:DATE
},{
timestamps:true, //是否自动写入时间戳
// tableName:'user' // 自定义数据表名称
freezeTableName: true
});
// User.sync({ force: true });
return User;
}
如上,注意看,在 created_at字段后,通过set对属性值进行处理,下面是数据对比:
-
未使用 get()获取器时:
返回的时我们定义User model时的DATE类型 -
使用获取器后的数据
设置器
针对新增和更新数据时,统一对某一属性进行处理
- 常用场景:通过一系列处理对用户的password进行加密处理
'use strict'
module.exports = app =>{
const {STRING,INTEGER,DATE,ENUM} = app.Sequelize
// 配置(重要:一定要配置详细,一定!!!)
const User = app.model.define('user',{
// ....
password:{
type:STRING(200),
allowNull:false,
defaultValue:'',
// set修改器
set(val){
// 新增字段的setter,新增和更新时使用
// this.setDataValue('password') // 设置原始值
this.setDataValue('password',val+'-crypto')
}
}
// ...
});
// User.sync({ force: true });
return User;
}
此时,当我们新增一条数据时:
数据库中的数据:
可以看到,数据库中的password字段值 是通过我们定义的user model中的password的set()设置器中的逻辑去处理之后保存的。