Sequelize带虚拟字段模型更新测试出现TypeError异常问题
问题原因解析
实例update与静态update的本质区别
- 用实例的
update()时,Sequelize会先从数据库拉取完整的Invoice实例(包括关联的items数据),更新recipient后,实例的items属性依然存在,虚拟字段计算时能正常调用reduce。 - 用模型静态
update()时,默认只更新指定的recipient字段,不会主动加载关联的items。如果你的测试逻辑在更新后会触发虚拟字段的计算(比如要返回更新后的实例并读取total/subtotal),此时实例的items是undefined,自然会抛出TypeError。
测试与生产环境的差异
生产环境静态update正常,主要是因为:
- 生产环境中,执行update后没有立即访问
total/subtotal,不会触发虚拟字段的计算流程; - 生产环境的update配置了
returning: false,不会返回实例,也就不会触发虚拟字段的计算。
更新items字段不报错的原因
当静态update更新items字段时,Sequelize会处理关联数据的变更,此时会自动加载或保留items的有效数据,虚拟字段计算时能拿到值,所以不会报错。
快速验证方向
检查测试代码里,静态update后是否有读取total/subtotal的逻辑,或者看测试环境的Sequelize配置是否默认开启了returning: true,导致更新后返回实例并触发虚拟字段计算。
内容的提问来源于stack exchange,提问作者Enrique Moreno Tent
相关产品推荐
相关产品推荐

