概述
记一次midway+typeorm应用事务时踩的坑以及解决思路
typeorm官网目前给出了三种应用事务的方式:
- 手动创建和使用事务
- 使用事务装饰器
- 使用QueryRunner
第一种方式看文档就不是很喜欢,直接pass,第三种是网上示例最多的,但是手动的方式明显要麻烦一点,所以初步先确定使用事务装饰器的方式。
按照官网的示例代码写上去,跑不通……
好吧,开始踩坑之旅:
- 事务肯定是针对操作数据库的,所以明显应该放到service层,然后按照官网示例放过去,发现controller和service的参数不匹配。
然后才想起来,typeorm的事务,是要增加一个manager参数,而java中写事务代码时,好像是通过use得到了一个连接(个人理解,不一定对),反正是不需要增加代码的。 - 鉴于参数匹配问题,只能把事务的装饰器放到controller。然后运行代码,又发现提示错误:
Cannot save, given value must be instance of entity class, instead object literal is given. Or you must specify an entity target to method call.
大概意思就是必须给定一个实体类的实例,而我给了一个对象。
这就是我搞了几个小时也没明白的地方,官网代码如下:
这意思不就是给个user对象吗,没说要实例化啊。@Transaction() save(@TransactionManager() manager: EntityManager, user: User) { return manager.save(user); }
- 根据midway给的提示,继续改代码。不得不说,好的错误提示至关重要,最近几个月,一直在趟路,egg的js版,egg升级到ts版,然后是midway都走了一遍,遇到问题网上的解决方案很少,大部分还是得靠框架的错误提示,这点egg和midway做的都相当好。
言归正传,查ES6语法,按照阮大神的教程,给我的实体对象创建一个构造函数,然后用上面官网推荐写法,传入一个对象,然后报错……
构造函数如下:
错误提示我,id属性不能属于undefined,意思就是data不存在constructor(data) { this.id = data.id; this.roleid = data.roleid; this.userid = data.userid; }
然后就发现,可能在实体创建的时候,比如获取list的时候,就会运行一次构造函数,而这个时候,我还没有传值。 - 好吧,那就继续改造吧。两种方式,一种是在constructor函数的形参那里,直接设置一个默认值,这是es6的语法,但是需要为下面的三个属性依次设置默认值,如果是三十个属性呢……第二种,是为data定义一个默认值,比如data={}
改造后:
然后继续跑,发现能跑通。但是跑完发现,这种方式不满足我的需求,所以没有具体去试这个事务有没有起作用。我还得老老实实写QueryRunner。constructor(data) { let newData = data || {}; this.id = newData .id; this.roleid = newData .roleid; this.userid = newData .userid; }
为了避免以后用到的时候忘记,特此记录。
完整的核心代码:
controller:
service:@Post('/save') @Transaction() async roleUserSave(@Body('roleUserData') data: object,@TransactionManager() manager:EntityManager) { const rs = await this.roleUserService.save(manager,data).catch(err => { return { success: false, msg:'保存失败' } }) return rs }
roleUser对象:async save(manager:EntityManager ,data) { let rs:any=''; let dataOrm = new RoleUser(data); rs=await manager.save(dataOrm); if(rs && Object.keys(rs).length>0){ return { success: true, msg:'保存成功' } }else{ return { success: false, msg:'保存失败' } } }
import { EntityModel } from '@midwayjs/orm'; import {Column, PrimaryColumn} from 'typeorm'; @EntityModel('mid_role_user') export class RoleUser { constructor(data) { let newData = data || {}; this.id = newData.id; this.roleid = newData.roleid; this.userid = newData.userid; } @PrimaryColumn({ length:36 }) id: string; @Column({ length:36 }) roleid: string; @Column({ length:36 }) userid: string; }
最后
以上就是野性夏天为你收集整理的midway+typeorm应用事务的全部内容,希望文章能够帮你解决midway+typeorm应用事务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复