#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()
декоратору, какое соединение следует использовать. Если вы не передаете никакого имени соединения, используется соединение по умолчанию.