addAssociation 上的 Promise 已使用旧版本的源解决
Promise on addAssociation is resolved with a stale version of the source
我有一个版本控制架构,可以对 object_version
table
中的 object
个条目进行版本控制
const Object = sequelize.define('object', {})
const ObjectVersion = sequelize.define('object_version', {
title: {
allowNull: false,
type: DataTypes.STRING
}
})
Object.hasMany(ObjectVersion, { as: 'versions' })
使用 express,我有一个可以更新现有 object
条目的放置路由,在这个简单的示例中,通过设置新的 title
,例如通过发送正文为 {"title":"new title"}
的 PUT 请求
app.put('object/:id', (req, res) => {
const id = parseInt(req.params.id, 10)
Object.findOne({
where: { id },
include: [ Object.associations.versions ]
}).then(object => {
const newVersion = ObjectVersion.build(req.body, { objectId: id })
Object.addVersion(newVersion).then(object => {
// shouldn't this instance have all versions, including the new one?
// do i need to `findOne` again to get them?
console.log(object.toJSON().versions)
res.send(object)
})
}
})
})
当使用通过 hasMany
将其关联到 ObjectVersion 模型而在我的对象模型上创建的 addVersion
方法时,returned 承诺通过对象实例解析。
问题是我想 return 响应中的对象 JSON,但是用于解析 promise 的对象实例不包含刚刚添加的版本。
对我来说,这看起来像是一个疏忽。应该没有必要执行另一个查询。当 addXyz
操作的承诺得到解决时,新的关联已经保存在数据库中,因此应该可以使用对象的更新版本来解决承诺。
也许我做错了,或者错过了一种更简单的方法来执行添加新关联的更新操作。欢迎任何帮助!
在 Slack 上有趣的谈话之后,我意识到模型实例上的 addAssociation
、addAssociations
和 setAssociations
方法将数据库中的现有行与目标连接起来。
在我的示例中,addVersion
方法将现有 object_version
行与当前 version
实例连接起来,not 可以用于向数据库中插入一个新行。
我已经打开了一个 PR 来续集,试图在文档中澄清这一点,因为我跳过了这一点。一个有效的示例可能如下所示:
app.put('object/:id', (req, res) => {
const id = parseInt(req.params.id, 10)
Object.findOne({
where: { id },
include: [ Object.associations.versions ]
}).then(object => {
object.createVersion(req.body).then(version => {
object.versions.push(version)
res.send(object)
})
})
})
我有一个版本控制架构,可以对 object_version
table
object
个条目进行版本控制
const Object = sequelize.define('object', {})
const ObjectVersion = sequelize.define('object_version', {
title: {
allowNull: false,
type: DataTypes.STRING
}
})
Object.hasMany(ObjectVersion, { as: 'versions' })
使用 express,我有一个可以更新现有 object
条目的放置路由,在这个简单的示例中,通过设置新的 title
,例如通过发送正文为 {"title":"new title"}
app.put('object/:id', (req, res) => {
const id = parseInt(req.params.id, 10)
Object.findOne({
where: { id },
include: [ Object.associations.versions ]
}).then(object => {
const newVersion = ObjectVersion.build(req.body, { objectId: id })
Object.addVersion(newVersion).then(object => {
// shouldn't this instance have all versions, including the new one?
// do i need to `findOne` again to get them?
console.log(object.toJSON().versions)
res.send(object)
})
}
})
})
当使用通过 hasMany
将其关联到 ObjectVersion 模型而在我的对象模型上创建的 addVersion
方法时,returned 承诺通过对象实例解析。
问题是我想 return 响应中的对象 JSON,但是用于解析 promise 的对象实例不包含刚刚添加的版本。
对我来说,这看起来像是一个疏忽。应该没有必要执行另一个查询。当 addXyz
操作的承诺得到解决时,新的关联已经保存在数据库中,因此应该可以使用对象的更新版本来解决承诺。
也许我做错了,或者错过了一种更简单的方法来执行添加新关联的更新操作。欢迎任何帮助!
在 Slack 上有趣的谈话之后,我意识到模型实例上的 addAssociation
、addAssociations
和 setAssociations
方法将数据库中的现有行与目标连接起来。
在我的示例中,addVersion
方法将现有 object_version
行与当前 version
实例连接起来,not 可以用于向数据库中插入一个新行。
我已经打开了一个 PR 来续集,试图在文档中澄清这一点,因为我跳过了这一点。一个有效的示例可能如下所示:
app.put('object/:id', (req, res) => {
const id = parseInt(req.params.id, 10)
Object.findOne({
where: { id },
include: [ Object.associations.versions ]
}).then(object => {
object.createVersion(req.body).then(version => {
object.versions.push(version)
res.send(object)
})
})
})