首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义存储库中带有Typeorm事务的Nestjs

自定义存储库中带有Typeorm事务的Nestjs
EN

Stack Overflow用户
提问于 2020-03-21 17:27:35
回答 1查看 9.1K关注 0票数 5

我在NestJS/Typeorm中有这样的自定义存储库类:

代码语言:javascript
复制
import { Repository, EntityRepository, getConnection } from 'typeorm';
import { RefreshToken } from './refresh-token.entity';
import { User } from './user.entity';
import { InternalServerErrorException } from '@nestjs/common';

@EntityRepository(RefreshToken)
export class RefreshTokenRepository extends Repository<RefreshToken> {

  async refreshToken({ token, user }: RefreshToken): Promise<RefreshToken> {
    const connection = getConnection();
    const queryRunner = connection.createQueryRunner();

    // establish real database connection using our new query runner
    await queryRunner.connect();

    // lets now open a new transaction:
    await queryRunner.startTransaction();

    try {
      // execute some operations on this transaction:
      await queryRunner.manager.delete(RefreshToken, { token });

      const refreshToken = await queryRunner.manager.save(
        this.buildToken(user),
      );

      // commit transaction now:
      await queryRunner.commitTransaction();

      return refreshToken;
    } catch (err) {
      // since we have errors lets rollback changes we made
      await queryRunner.rollbackTransaction();
    } finally {
      // you need to release query runner which is manually created:
      await queryRunner.release();
    }
  }
}

请问是否有一种与我在refreshToken()方法中使用的方法不同的方法来进行/构建事务?因为连接感觉中断,不适合NestJS的工作方式。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-22 11:30:55

您可以使用正式的集成(包@nestjs/typeorm),以便您的代码不关心获得到数据库(正式文件)的连接。

使用TypeOrmModule (@nestjs/typeorm),您可以创建(并导入)一个动态模块,负责建立到数据库的连接。

代码语言:javascript
复制
@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

然后,您不需要关心存储库代码中的连接。

如果您已经使用"raw“TypeORM创建了一个连接(比方说,当应用程序启动时),那么Repository已经知道如何使用它了。您可以直接处理您的请求,如下所示:

代码语言:javascript
复制
try {
  const refreshToken = await this.manager.transaction(async entityManager => {
    await entityManager.delete(RefreshToken, { token });
    return entityManager.save(RefreshToken, this.buildToken(user));
  });

  // commit done: use refreshToken here
} catch (error) {
  // rollback done: handle error here
}

您不能直接从存储库启动事务,但是可以访问(公共API)它的管理器,后者可以启动事务。它提供了一个实体管理器,*必须用于事务的所有操作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60791014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档