在Sequelize中,我有一个模型WorkFile
,它具有以下实例方法
workfile.update({ path: '/path/to/here' }).then(result => {
return result;
})
除result
包含以下内容
{
"created_at": "2017-03-02T16:32:42.542Z",
"updated_at": {
"val": "NOW()"
},
// etc
}
更新方法有效,但updated_at
仍然是db文字。 只有在模型中有afterCreate
挂钩时才会发生。我尝试了workfile.get()
,workfile.get({ plain: true })
。我设法做的唯一工作就是重新查询数据库中的对象,这看起来很荒谬。有没有办法在没有文字updated_at?
被修改
这是钩子:
afterCreate: function(workfile, options, cb) {
return workfile.update({
path: `path/with/${workfile.id}`
})
.then(wf => cb(null, workfile)) // <--workfile and wf both have literal updated_at
.catch(err => cb(err));
}
答案 0 :(得分:0)
对于未来的人来说,在我的模型中,我使用的是Sequelize.literal('NOW()')
。当我用Sequelize.NOW
替换它时,问题就消失了。不完全确定原因,但它可以作为修复工具!
答案 1 :(得分:-1)
您正在调用workfile.update()
,它返回0位置中已更改行数的数组以及1位置中受影响的行数。您正在查看Model
而不是Instance
这就是您看到&#34; NOW()&#34; - 它将在DB和每个实例中转换为日期时间。
在您的afterCreate
功能中,您接受了branch
实例,然后在workfile
模型上,在没有update()
的情况下呼叫WHERE
,这样它就会更新workfile
模型表中的所有行。你也得到一个数组,而不是上面提到的实例。
目前还不清楚branch
是否为workfile
,但如果您想更改特定实例/行的属性,则应使用:
// change the "path" on the "branch" Instance after each create
afterCreate: function(instance) {
// "instance" is an Instance of a "workfile" Model
instance.path: `path/with/${instance.id}`;
// call Instance.save() on the "instance" variable it after you set the property.
return instance.save();
}
如果您确实想要更新所有workfile
,无论branch
是什么,您都可以使用以下
// change the "path" on ALL "workfile" rows, displaying the results.
afterCreate: function() {
return workfile.update({ path: `path/with/${workfile.id}` })
.then(result => {
console.log(`Updated ${result[0]} rows`);
console.log('Affected rows:', result[1]);
// since we are printing out the result here we also
// need to return in in a Promise
return Promise.resolve(result);
})
.catch(err => console.log("Error!", err));
}
您不需要包含您不使用的功能参数,默认情况下Sequelize使用Promises,因此您只需返回update()
/ save()
而不是使用回调。
另一种选择是使用VIRTUAL
字段而不是将其存储在数据库中,因为您真正需要的是ID
。
Sequelize.define('model', {
path: {
type: DataTypes.VIRTUAL,
get: function getType() {
return `path/with/${this.id}`;
},
}
);