addAssociation上的Promise是用源代码的陈旧版本解决的

Promise on addAssociation is resolved with a stale version of the source

本文关键字:陈旧 版本 解决 源代码 上的 Promise addAssociation      更新时间:2023-09-26

我有一个版本控制模式,用于版本object_version表中的object条目

const Object = sequelize.define('object', {})
const ObjectVersion = sequelize.define('object_version', {
    title: {
        allowNull: false,
        type: DataTypes.STRING
    }
})
Object.hasMany(ObjectVersion, { as: 'versions' })

使用express,我有一个put路由,在这个简单的例子中,可以通过设置新的title来更新现有的object条目,例如通过发送带有{"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)
            })
        }
    })
})

当使用在我的Object模型上通过hasMany将其关联到ObjectVersion模型而创建的addVersion方法时,返回的promise将通过对象实例进行解析。

问题是,我想在响应中返回对象JSON,但解决promise的对象实例不包含刚刚添加的版本。

对我来说,这看起来像是疏忽。应该不需要执行另一个查询。当解析addXyz操作的promise时,新的关联已经保存在数据库中,因此应该可以使用对象的更新版本来解析promise。

也许我走错了路,或者错过了一个更简单的方法来执行添加新关联的更新操作。欢迎任何帮助!

在Slack上进行了一次有趣的讨论后,我意识到模型实例上的addAssociationaddAssociationssetAssociations方法将数据库中的现有行与目标连接起来。

在我的示例中,addVersion方法将现有的object_version行与当前的version实例连接起来,并且可以而不是用于向数据库中插入新行。

我已经打开了一个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)
        })
    })
})