Проблема с выбором базы данныхnesjs/typeorm

Добрый день, ночи. У меня проблема с выбором базы данных. Я работаю сnesjs и typeorm. Где мне получить доступ к базе данных atos 2 и просмотреть ее записи. Проблема в том, что когда я указываю на него для доступа, он читает первую базу данных вместо второй. Прикрепляю файлы:

typeorm.config.ts: (Местоположение моей второй базы данных)

import { DataSource } from 'typeorm'
import * as dotenv from 'dotenv';
dotenv.config()

export const secondDataSource = new DataSource({
    type: 'mysql',
    host: process.env.DB_HOST2,
    port: parseInt(process.env.DB_PORT2),
    username: process.env.DB_USERNAME2,
    password: process.env.DB_PASSWORD2,
    database: process.env.DB_NAME2,
    synchronize: false,
    dropSchema: false,
    logging: false,
    logger: 'file',
    entities: [
        "./src/*/*/*.entity.ts"
    ],
    migrations:["migrations/*$yarn_config_pruebatestS.ts"]
})

app.module.ts: (Местоположение моей первой базы данных)

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TchiaModule } from './tchia/tchia.module';   
import { TfachisaModule } from './tfachisa/tfachisa.module';

@Module({
  imports: [ConfigModule.forRoot({ isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV}` }),
    TypeOrmModule.forRootAsync({
      imports:[ConfigModule],
      useFactory: (configService: ConfigService) => ({
        type: 'mysql',
        host: configService.get('DB_HOST'),
        port: configService.get('DB_PORT'),
        username: configService.get('DB_USERNAME'),
        password: configService.get('DB_PASSWORD'),
        database: configService.get('DB_NAME'),
        autoLoadEntities: true
      }),
      inject:[ConfigService],
    }),
    TchiaModule,
    TfachisaModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule { }

tfachisa.service.ts: (место, где я хочу просмотреть таблицу моей второй базы данных)

import { Injectable } from '@nestjs/common';
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
import { Tfachisa } from './entities/tfachisa.entity';
import { DataSource, Repository } from 'typeorm';
import { secondDataSource } from 'typeorm.config';

@Injectable()
export class TfachisaService {
  constructor(
    @InjectRepository(Tfachisa)
    private readonly tfachisaRepository:Repository<Tfachisa>,
    @InjectDataSource(secondDataSource)
    private readonly seconddataSource: DataSource
  ){}

  async findAll() {
    const data = await this.seconddataSource.query('SELECT * FROM tchia')
    console.info(data)
  }
}

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на документации NestJS, касающейся нескольких источников данных (https://docs.nestjs.com/techniques/database#multiple-databases), вам необходимо:

УПД:

Если вы используете TypeOrmModule.forRootAsync, вам также необходимо установить имя источника данных вне useFactory.

Обновлен app.module.ts до правильного состояния. Поле name должно быть указано для RootAsync.

  1. Модуль импорта для второго источника данных

app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TchiaModule } from './tchia/tchia.module';   
import { TfachisaModule } from './tfachisa/tfachisa.module';

@Module({
  imports: [ConfigModule.forRoot({ isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV}` }),
    // It will be the default data source
    TypeOrmModule.forRootAsync({
      imports:[ConfigModule],
      useFactory: (configService: ConfigService) => ({
        type: 'mysql',
        host: configService.get('DB_HOST'),
        port: configService.get('DB_PORT'),
        username: configService.get('DB_USERNAME'),
        password: configService.get('DB_PASSWORD'),
        database: configService.get('DB_NAME'),
        autoLoadEntities: true
      }),
      inject:[ConfigService],
    }),
    // It will be the second and named data source ()
    TypeOrmModule.forRootAsync({
      imports:[ConfigModule],
      name: 'secondDataSource'
      useFactory: (configService: ConfigService) => ({
        type: 'mysql',
        host: configService.get('DB_HOST2'),
        port: configService.get('DB_PORT2'),
        username: configService.get('DB_USERNAME2'),
        password: configService.get('DB_PASSWORD2'),
        database: configService.get('DB_NAME2'),
        synchronize: false,
        dropSchema: false,
        logging: false,
        logger: 'file',
        entities: [
           "./src/*/*/*.entity.ts"
        ],
        migrations:["migrations/*$yarn_config_pruebatestS.ts"]
      }),
      inject:[ConfigService],
    }),
    TchiaModule,
    TfachisaModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule { }
  1. Импортируйте второй источник данных по имени (или вы можете заменить его токеном, чтобы не использовать «магическую» строку)

tfachisa.service.ts

import { Injectable } from '@nestjs/common';
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
import { Tfachisa } from './entities/tfachisa.entity';
import { DataSource, Repository } from 'typeorm';

@Injectable()
export class TfachisaService {
  constructor(
    @InjectRepository(Tfachisa)
    private readonly tfachisaRepository:Repository<Tfachisa>,
    @InjectDataSource('secondDataSource')
    private readonly seconddataSource: DataSource
  ){}

  async findAll() {
    const data = await this.seconddataSource.query('SELECT * FROM tchia')
    console.info(data)
  }
}

Или вы можете попробовать повторно использовать второй источник данных таким образом в app.module.ts:

TypeOrmModule.forRootAsync({
      imports:[ConfigModule],
      name: 'secondDataSource'
      dataSourceFactory: async () => {
        const dataSource = secondDataSource; // don't forget to import this from typeorm.config.ts
        return dataSource.initialize();
      },
    }),

Добрый вечер. Я сделал то, что мне дали, а также прочитал документацию, но у меня все еще есть та же проблема. Он по-прежнему подключен к BD1 вместо BD2. Продолжаю делать тесты и тесты но все они указывают на BD1. Единственный способ атаковать BD2 — полностью удалить BD1.

Yisus_Dra 24.06.2024 23:15

Обновленный ответ. name для второго источника данных должен находиться в forRootAsync.

P. Vorontsov 25.06.2024 00:47

Брат, спасибо тебе большое. У меня уже работает идеально

Yisus_Dra 25.06.2024 03:23

Другие вопросы по теме

Похожие вопросы

Глубокий ключ вложенного объекта в машинописном тексте
Ошибка компиляции TypeScript: ошибка TS5024: для параметра компилятора «цель» требуется значение строки типа
Тип «строка» не может использоваться для индексации типа «Объект» с помощью цикла for
@types/node — это две основные версии Node.js
Ограничение аргумента обратного вызова, передаваемого другой функции
Присвоение типа переменной на основе значения другой переменной
Как заставить машинописный текст понимать фабричную функцию, которая возвращает определения динамических классов?
Как настроить @cypress/code-coverage для Angular и TypeScript
Получение ошибки: функция, объявленный тип которой не является ни «неопределенным», ни «недействительным», ни «любым», должна возвращать значение
Как создать универсальный крючок для извлечения данных в TypeScript для API с различными структурами ответов?