addAssociation上的Promise是用源代码的陈旧版本解决的
Promise on addAssociation is resolved with a stale version of the source
我有一个版本控制模式,用于版本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上进行了一次有趣的讨论后,我意识到模型实例上的addAssociation
、addAssociations
和setAssociations
方法将数据库中的现有行与目标连接起来。
在我的示例中,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)
})
})
})
相关文章:
- JS编译器/包管理器,用于版本控制
- jQuery-2.1.1.min.js或最新版本jQuery-2.13.min.js不会't支持'@
- Chrome加载旧版本的Javascript文件
- 如何使用js将SNAPSHOT内部版本号转换为3位数的整数
- 为什么jQuery 1.8不能在IE8和InternetExplorer9中使用?(截至2012年9月的IE9最新版本)
- 如何设置jsfiddle's的javascript版本
- 同一HTML页面中的两个不同版本的JQuery
- YouTube作为弹出窗口在桌面版本上播放,但不在移动设备上播放
- 有没有一种方法可以获得three.js的最小/lite版本
- Node和Nodejs版本不同
- 以ECMAScript 5及更高版本为目标时,八进制文字不可用
- 如何在HTML中指定Javascript的版本
- 注册组件的非角度和角度版本
- 浏览器是否持久缓存脚本元素的编译版本
- 如何确定相对较新版本的IE的高度和宽度(IE8不喜欢从JavaScript设置这种样式吗?
- 如何在IE8及以前版本中处理mousemove
- 从自身的一个版本中创建新的JavaScript对象
- PhpWindows 8.1版本上的Javascript web应用程序
- Chrome坚持保留陈旧的javascript代码,并赢得了't重新加载最新版本
- addAssociation上的Promise是用源代码的陈旧版本解决的