TypeORM adapter
Installation
- npm
- yarn
- pnpm
npm install @nestjs-cls/transactional-adapter-typeorm
yarn add @nestjs-cls/transactional-adapter-typeorm
pnpm add @nestjs-cls/transactional-adapter-typeorm
important
Please note that due to the deliberate choice to not monkey-patch any underlying library, the only way to propagate the transaction using this adapter is by using the EntityManager. There is no transactional support for working directly with repositories without getting them through the (transactional) EntityManager
For a more fully-featured solution for TypeORM, see the typeorm-transactional community package.
Registration
ClsModule.forRoot({
plugins: [
new ClsPluginTransactional({
imports: [
// module in which the database instance is provided
TypeOrmModule
],
adapter: new TransactionalAdapterTypeOrm({
// the injection token of the database instance
dataSourceToken: DataSource,
}),
}),
],
}),
note
When using with @nestjs/typeorm, the data source token needs to be retrieved with the getDataSourceToken function, that can be optionally provided with a custom connection name.
import { getDataSourceToken } from '@nestjs/typeorm';
// ...
new TransactionalAdapterTypeOrm({
dataSourceToken: getDataSourceToken(),
});
Typing & usage
The tx property on the TransactionHost<TransactionalAdapterTypeOrm> is typed as EntityManager.
Example
user.service.ts
@Injectable()
class UserService {
constructor(private readonly userRepository: UserRepository) {}
@Transactional()
async runTransaction() {
// both methods are executed in the same transaction
const user = await this.userRepository.createUser('John');
const foundUser = await this.userRepository.getUserById(user.id);
assert(foundUser.id === user.id);
}
}
user.repository.ts
@Injectable()
class UserRepository {
constructor(
private readonly txHost: TransactionHost<TransactionalAdapterTypeOrm>,
) {}
async getUserById(id: number) {
// txHost.tx is typed as EntityManager
return await this.txHost.tx.getRepository(User).findOneBy({ id });
}
async createUser(name: string, email: string) {
return await this.txHost.tx.getRepository(User).save({
name,
email: `${name}@email.com`,
});
}
}