typeorm 事务操作在 nestjs 中实现

1,998 阅读1分钟

前言: 在 typeorm 开发文档中, 事务已经有很好的使用方法了, 但是在 nestjs 中, 会发现有点区别.

创建和使用事务

事务是使用ConnectionEntityManager创建的。 例如:

import { getConnection } from "typeorm";

await getConnection().transaction(transactionalEntityManager => {});
    

or

import { getManager } from "typeorm";
await getManager().transaction(transactionalEntityManager => {});

然后

import { getManager } from "typeorm";

await getManager().transaction(async transactionalEntityManager => {
  await transactionalEntityManager.save(users);
  await transactionalEntityManager.save(photos);
  // ...
});

但是在 nestjs 上, 会发现 import { getConnection } from "typeorm";import { getManager } from "typeorm"; 会提示已经放弃.

“getConnection”已弃用。ts(6385)

[globals.d.ts(64, 4): ]()该声明曾在此处标记为已弃用。

已声明“getConnection”,但从未读取其值。ts(6133)

(alias) function getConnection(connectionName?: string): DataSource  
import getConnection

Gets connection from the connection manager. If connection name wasn't specified, then "default" connection will be retrieved.

*@deprecated*

正解的使用方法是

使用 Repository 实体就行了. 比如下面的 messageRepo

constructor(
    @InjectRepository(Message) private messageRepo: Repository<Message>,
  ) { }
async send(messageDto: MessageDto): Promise<any> {
    // 创建数据库事务,  在这里直接取得 connection, 用这个来开启事务, 然后用里面的 transactionalEntityManager 来代替操作 this.messageRepo 的操作. 如果出现异常错误, 数据库就会回退回去.
    const connection = this.messageRepo.manager.connection
    await connection.transaction(async transactionalEntityManager => {
      // 保存消息
      const message = new Message()
      message.content = messageDto.content
      let res = await transactionalEntityManager.save(message)
      if (!res) {
        Logger.error('消息未保存成功')
        // 抛出前也可以作其它操作.
        throw new HttpException('消息未保存成功', HttpStatus.INTERNAL_SERVER_ERROR);
      }
      return res
    })
  }

上面整体也可以用一个 try catch 来统一抛异常做处理.

其它的操作可以参考开发文档, 只是注意, connection 是从下面取到的就行了.

const connection = this.messageRepo.manager.connection