Nest не может разрешить зависимости для репозитория при наличии более одного подключения к базе данных

#node.js #nestjs #typeorm

#node.js #nestjs #typeorm

Вопрос:

В моем проекте есть два подключения к базе данных, поэтому мне пришлось назвать одно из них в соответствии с рекомендациями документации. Модуль, который использует это именованное соединение, не может разрешить зависимость для репозитория моей сущности, и я не могу выяснить, почему.

Я считаю, что это как-то связано с «именованием» соединений, потому что, когда я назвал основное соединение, у других репозиториев возникла та же проблема.

Ценю любую помощь!

Ошибка:

 Nest can't resolve dependencies of the DataFactService (?). Please make sure that the argument DataFactRepository at index [0] is available in the DataFactModule context.

Potential solutions:
- If DataFactRepository is a provider, is it part of the current DataFactModule?
- If DataFactRepository is exported from a separate @Module, is that module imported within DataFactModule?
  @Module({
    imports: [ /* the Module containing DataFactRepository */ ]
  })
 

Модуль:

 @Module({
    imports: [TypeOrmModule.forFeature([DataFact], 'sumarized')],
    controllers: [DataFactController],
    providers: [DataFactService],
})
export class DataFactModule {}
 

Служба:

 @Injectable()
export class DataFactService {
    constructor(
        @InjectRepository(DataFact)
        private dataFactRepository: Repository<DataFact>,
    ) {}
}
 

Подключение к базе данных

 @Module({
    imports: [
        TypeOrmModule.forRootAsync({
            name: 'sumarized',
            imports: [ConfigModule],
            inject: [ConfigService],
            useFactory: (configService: ConfigService) => ({
                synchronize: false,
                type: 'mysql',
                host: configService.get('DB_HOST'),
                port: configService.get('DB_PORT'),
                username: configService.get('DB_USER'),
                password: configService.get('DB_PASSWORD'),
                database: configService.get('DB_SUMARIZED_DATABASE'),
                entities: [__dirname   '/../**/*.entity.{js,ts}'],
            }),
        }),
    ],
})
export class SumarizedDatabaseModule {}
 

Модуль приложения:

 @Module({
    imports: [
        ConfigModule.forRoot({
            envFilePath: `.env.${process.env.NODE_ENV}`,
            isGlobal: true,
        }),
        WinstonModule.forRoot(winstonConfig),
        UsersModule,
        AuthModule,
        StoresEventsModule,
        StationsModule,
        DatabaseModule,
        MailerModule,
        SumarizedDatabaseModule,
        DataFactModule,
        SumarizedEventsModule,
    ],
    controllers: [],
    providers: [
        {
            provide: APP_INTERCEPTOR,
            useClass: LoggerInterceptor,
        },
    ],
})
export class AppModule {}
 

Ответ №1:

Вам нужно использовать @InjectRepository(EntityClass, databaseName) , если вы вводите объект из соединения, а не по умолчанию. Это упоминается в документах

При такой настройке вы должны указать TypeOrmModule.forFeature() методу и @InjectRepository() декоратору, какое соединение следует использовать. Если вы не передаете никакого имени соединения, используется соединение по умолчанию.