我在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的工作方式。
谢谢。
发布于 2020-03-22 11:30:55
您可以使用正式的集成(包@nestjs/typeorm),以便您的代码不关心获得到数据库(正式文件)的连接。
使用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 {}然后,您不需要关心存储库代码中的连接。
如果您已经使用"raw“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
}您不能直接从存储库启动事务,但是可以访问(公共API)它的管理器,后者可以启动事务。它提供了一个实体管理器,*必须用于事务的所有操作。
https://stackoverflow.com/questions/60791014
复制相似问题