Не могу разрешить зависимость в Nest.js
Работаю над бекэнд-приложением на Nest.js. Данные хранятся в БД PostgreeSQL, общаюсь с БД через SRM sequelize. Все работало хорошо, пока не появилась необходимость использовать транзакции при запросах к БД и обрабатывать транзакцию в интерцепторе. Инициализация sequelize происходит в отдельном модуле database.module.ts:
import { Module } from '@nestjs/common'
import { Sequelize } from 'sequelize-typescript'
export const databaseProviders = [
{
provide: 'SEQUELIZE',
useFactory: async () => {
const sequelize = new Sequelize({
dialect: 'postgres',
host: process.env.POSTGRES_HOST,
port: Number(process.env.POSTGRES_PORT),
username: process.env.POSTGRES_USER,
password: process.env.POSTGRES_PASSWORD,
database: process.env.POSTGRES_DB
})
sequelize.addModels([
//...различные модели
])
return sequelize
}
}
]
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders, 'SEQUELIZE']
})
export class DatabaseModule {}
Вот модуль, в котором происходят транзакции:
import { Module } from '@nestjs/common'
import { EventsService } from './events.service'
import { EventsController } from './events.controller'
import { eventsProviders } from './providers/events.providers'
import { Sequelize } from 'sequelize-typescript'
@Module({
controllers: [EventsController],
providers: [
EventsService,
...eventsProviders,
{
provide: 'SEQUELIZE',
useValue: Sequelize
}
],
imports: [DatabaseModule]
})
export class EventsModule {}
И вот сам интерцептор:
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common'
import { catchError, tap, throwError } from 'rxjs'
import { Transaction, Sequelize } from 'sequelize'
import { InjectConnection } from '@nestjs/sequelize'
import { providers } from 'src/constants'
@Injectable()
export class TransactionInterceptor implements NestInterceptor {
constructor(@InjectConnection() private sequelize: Sequelize) {}
async intercept(context: ExecutionContext, next: CallHandler) {
const req = context.switchToHttp().getRequest()
const transaction: Transaction = await this.sequelize.transaction()
req.t = transaction
return next.handle().pipe(
tap(() => {
transaction.commit()
}),
catchError(err => {
transaction.rollback()
return throwError(() => new Error(err))
})
)
}
}
При компиляции кода возникает ошибка:
Nest can't resolve dependencies of the TransactionInterceptor (?). Please make sure that the argument Sequelize at index [0] is available in the EventsModule context.
Potential solutions:
- Is EventsModule a valid NestJS module?
- If Sequelize is a provider, is it part of the current EventsModule?
- If Sequelize is exported from a separate @Module, is that module imported within EventsModule?
@Module({
imports: [ /* the Module containing Sequelize */ ]
})
Попробовал сделать внедрение sequelize в интерцептор другим способом:
constructor(@Inject('SEQUELIZE') private sequelize: Sequelize) {}
В этом случае ошибок компиляции нет, но при запросе, ведущем к работе интерсептора, возникает ошибка:
this.sequelize.transaction is not a function
Прошу помощи у братьев и сестер - программистов, а то у меня уже идеи по внедрению инстанса sequelize в интерцептор закончились.