我是靠谱客的博主 顺心绿茶,最近开发中收集的这篇文章主要介绍midway+typeorm应用事务,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

记一次midway+typeorm应用事务时踩的坑以及解决思路
typeorm官网目前给出了三种应用事务的方式:

  • 手动创建和使用事务
  • 使用事务装饰器
  • 使用QueryRunner
    第一种方式看文档就不是很喜欢,直接pass,第三种是网上示例最多的,但是手动的方式明显要麻烦一点,所以初步先确定使用事务装饰器的方式。
    按照官网的示例代码写上去,跑不通……
    好吧,开始踩坑之旅:
  1. 事务肯定是针对操作数据库的,所以明显应该放到service层,然后按照官网示例放过去,发现controller和service的参数不匹配。
    然后才想起来,typeorm的事务,是要增加一个manager参数,而java中写事务代码时,好像是通过use得到了一个连接(个人理解,不一定对),反正是不需要增加代码的。
  2. 鉴于参数匹配问题,只能把事务的装饰器放到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.
    大概意思就是必须给定一个实体类的实例,而我给了一个对象。
    这就是我搞了几个小时也没明白的地方,官网代码如下:
    @Transaction()
    save(@TransactionManager() manager: EntityManager, user: User) {
    return manager.save(user);
    }
    
    这意思不就是给个user对象吗,没说要实例化啊。
  3. 根据midway给的提示,继续改代码。不得不说,好的错误提示至关重要,最近几个月,一直在趟路,egg的js版,egg升级到ts版,然后是midway都走了一遍,遇到问题网上的解决方案很少,大部分还是得靠框架的错误提示,这点egg和midway做的都相当好。
    言归正传,查ES6语法,按照阮大神的教程,给我的实体对象创建一个构造函数,然后用上面官网推荐写法,传入一个对象,然后报错……
    构造函数如下:
    constructor(data) {
    this.id = data.id;
    this.roleid = data.roleid;
    this.userid = data.userid;
    }
    
    错误提示我,id属性不能属于undefined,意思就是data不存在
    然后就发现,可能在实体创建的时候,比如获取list的时候,就会运行一次构造函数,而这个时候,我还没有传值。
  4. 好吧,那就继续改造吧。两种方式,一种是在constructor函数的形参那里,直接设置一个默认值,这是es6的语法,但是需要为下面的三个属性依次设置默认值,如果是三十个属性呢……第二种,是为data定义一个默认值,比如data={}
    改造后:
    constructor(data) {
    let newData = data || {};
    this.id = newData .id;
    this.roleid = newData .roleid;
    this.userid = newData .userid;
    }
    
    然后继续跑,发现能跑通。但是跑完发现,这种方式不满足我的需求,所以没有具体去试这个事务有没有起作用。我还得老老实实写QueryRunner。
    为了避免以后用到的时候忘记,特此记录。
    完整的核心代码:
    controller:
    @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
    }
    
    service:
     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:'保存失败'
    }
    }
    }
    
    roleUser对象:
    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应用事务所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部