Совместное использование подключения TypeORM между различными модулями в NestJS - PullRequest
0 голосов
/ 11 марта 2020

Я занимаюсь разработкой средства сокращения ссылок, и для моего бэкэнда у меня есть CRUD REST API для обработки аутентификации и создания сокращенных ссылок и т. Д. c. Я также хочу обрабатывать перенаправления для сокращенных URL-адресов, но я не хочу они должны иметь тот же путь, что и мои конечные точки API (например, /api/v1/), поскольку я использую setGlobalPrefix для своего API. Проведя некоторые исследования в Интернете, я обнаружил следующую проблему Github , которая дала мне решение моей проблемы:

async function bootstrap() {
    const server = new ExpressAdapter();

    const apiFactory = new NestFactoryStatic();
    const apiApp = await apiFactory.create(ApiModule, server);
    apiApp.setGlobalPrefix('api/v1');
    await apiApp.init();

    const redirectFactory = new NestFactoryStatic();
    const redirectApp = await redirectFactory.create(RedirectModule, server);
    await redirectApp.init();

    http
        .createServer(server.getInstance())
        .listen(process.env.PORT || 3000);
}
bootstrap();

Но я столкнулся с другой проблемой, мне нужен доступ к моей базе данных в мой RedirectModule, у меня уже есть LinkRepository, созданный для моего REST API, но я не смог импортировать его в RedirectModule, вот код для ApiModule и то, что я уже пробовал.

@Module({
    imports: [TypeOrmModule.forRoot(typeOrmConfig), LinksModule, AuthModule],
    controllers: [LinksController],
    providers: [],
})
export class ApiModule {}

С RedirectModule просто пытаюсь импортировать LinkRepository как такую ​​функцию:

@Module({
    imports: [TypeOrmModule.forFeature([LinkRepository])],
    controllers: [RedirectController]
})
export class RedirectModule {}

Я получаю следующую ошибку:

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

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

Итак, у меня есть попытался импортировать ApiModule в RedirectModule, а также экспортировать TypeOrmModule.forRoot(typeOrmConfig) в отдельный файл и импортировать его в оба модуля, но затем я получаю сообщение об ошибке, сообщающее, что соединение уже существует: AlreadyHasActiveConnectionError: Cannot create a new connection named "default", because connection with such name already exist and it now has an active connection session.

Итак, как я могу разделить соединение между двумя отдельными модулями? Просмотр документации Nest не помог, поскольку предполагается, что все модули являются частью одного большого root модуля, а это не то, что я пытаюсь сделать.

Редактировать: Похоже, что основной проблемой является совместное использование модуля в приложении, так как я создаю 2 приложения с разными фабриками, он попытается снова подключиться к базе данных, поскольку кажется, что модули являются одиночными только в одном приложении. Есть ли какая-то работа вокруг этого? Или, альтернативно, еще один способ добиться того, что я пытаюсь сделать? (Другой префикс URL для одного указанного c модуля)

1 Ответ

0 голосов
/ 11 марта 2020

Объявите этот модуль как глобальный модуль с декоратором @Global. Объявите ваш модуль следующим образом:

@Global()
@Module({
  ...
})

Для дальнейшего чтения: https://docs.nestjs.com/modules#global -модули

...