Javascript 使用find时未调用Sequelize getter
我在模型的属性定义中定义了getter,它们如下所示:Javascript 使用find时未调用Sequelize getter,javascript,mysql,node.js,sequelize.js,Javascript,Mysql,Node.js,Sequelize.js,我在模型的属性定义中定义了getter,它们如下所示: timeReported: { type: DataTypes.DATE, defaultValue: Sequelize.NOW, get() { const input = this.getDataValue('timeReported') const output = moment(input).valueOf() return output
timeReported: {
type: DataTypes.DATE,
defaultValue: Sequelize.NOW,
get() {
const input = this.getDataValue('timeReported')
const output = moment(input).valueOf()
return output
},
set(input) {
var output = moment(input).toDate()
this.setDataValue('timeReported', output)
},
validate: {
isBefore: moment().format('YYYY-MM-DD')
}
}
const {dataValues} = yield models.Reporting.findOne({
where: {
reportNo: reportNo
}
})
我已尝试将getter添加到选项中的getterMethods
,而不是属性中的:
getterMethods: {
timeReported: function () {
debugger
const input = this.getDataValue('timeReported')
const output = moment(input).valueOf()
return output
}
}
我发现在保存时setter被正确执行,因为我使用时间戳作为请求负载。我还发现验证工作正常。
有趣的是,afterFind
钩子被正确调用,它确实表明customGetters
已经注册为我的模型上存在的
但是,在我的模型上调用find
方法时,如下所示:
timeReported: {
type: DataTypes.DATE,
defaultValue: Sequelize.NOW,
get() {
const input = this.getDataValue('timeReported')
const output = moment(input).valueOf()
return output
},
set(input) {
var output = moment(input).toDate()
this.setDataValue('timeReported', output)
},
validate: {
isBefore: moment().format('YYYY-MM-DD')
}
}
const {dataValues} = yield models.Reporting.findOne({
where: {
reportNo: reportNo
}
})
不会调用Mygetter
方法来转换数据以进行表示。在访问数据库之前,如何对从数据库中获取的数据调用这些方法
我已尝试将raw:false
属性与where
一起添加到queryOptions
。那是行不通的
注意:我使用co
获取数据,我必须从模型中检索dataValues
属性。所有示例似乎都没有使用该属性。在使用Sequelize时,不应该像我那样直接使用dataValues
属性。这将允许我访问存储在表中的底层数据,而无需调用getter
要在整个实例上调用所有getter函数,请执行以下操作:
const data = instance.get()
这还将填充在模型中定义的任何虚拟
字段。
要为单个属性调用getter
:
const propValue = instance.get('timeReported')
从Sequelize 5开始,似乎需要对属性本身调用getter。在Sequelize 4中,调用.get()
将调用所有getter函数。现在我们必须调用.get('timeReported')
(请参阅)。