gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:36:41 38 4
gpt4 key购买 nike

我有一个像这样的带有 NestJS/Typeorm 的自定义存储库类:

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 的工作方式。

谢谢。

最佳答案

您可以使用官方集成(包 @nestjs/typeorm )以使您的代码不关心获取与数据库的连接( official documentation )。

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

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

那么您就不需要关心存储库代码中的连接。

如果您已经使用“原始”TypeORM 创建了一个连接(比如说,当您的应用程序启动时),那么 Repository已经知道如何使用它。您可以直接处理您的请求,执行以下操作:

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
}

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

关于typescript - 自定义存储库中带有 Typeorm 事务的 Nestjs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60791014/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com