web-dev-qa-db-ja.com

NestJS + TypeORM:2つ以上のデータベースを使用しますか?

私はこれを解決するために2日以来試みています、おそらく私はここでポイントを単に逃しています。

私の目標は、プロジェクトごとにNestJS-Appを作成するのではなく、2つまたは3つの小さなプロジェクトにRestAPIを提供するNestJSアプリ(TypeORMを含む)を作成することでした。

これまでのところ、アプリは準備ができており、単一のプロジェクト(エンティティ、コントローラー、サービス、モジュールを含むサブフォルダーにあります)で正常に動作しますが、それらすべてで実行することはできません。

ポイントは構成のようです、私は_ormconfig.json_を使用しています:

_[ {
    "name": "Project1",
    "type": "mysql",
    "Host": "localhost",
    "port": 3306,
    "username": "<username>",
    "password": "<pwd>",
    "database": "<database>",
    "synchronize": false,
    "entities": ["project1/*.entity.ts"],
    "subscribers": ["project1/*.subscriber.ts"],
    "migrations": ["project1/migrations/*.ts"],
    "cli": { "migrationsDir": "project1/migrations" }
}, {
    "name": "project2",
    "type": "mysql",
    "Host": "localhost",
    "port": 3306,
    "username": "<another-username>",
    "password": "<another-pwd>",
    "database": "<another-database>",
    "synchronize": false,
    "entities": ["project2/*.entity.ts"],
    "subscribers": ["project2/*.subscriber.ts"],
    "migrations": ["project2/migrations/*.ts"],
    "cli": { "migrationsDir": "project2/migrations"
    } ]
_

エラーメッセージは言う:

[ExceptionHandler]接続のデフォルトが見つからない

もちろん、「デフォルト」とは異なる一意の名前を持つ2つの構成を提供しているため、「デフォルト」は見つかりませんでした。

ApplicationModuleでは、次のように接続の名前を指定できます。

_TypeOrmModule.forRoot( { name: "project1" } ),
_

ただし、1つのプロジェクトでのみ機能します。

すべてを1つの構成に混在させることもできますが、1つのデータベースにすべてを持ち、すべてのユーザーが同じで、エンティティを混在させる可能性があります...

誰かがこれを解決する方法のヒントを教えてくれますか?おそらく、すべてのモジュールでgetConnection(<name>)を使用しますが、次にApplicationModuleを開始する方法は?

敬具、
sagerobert

9
sagerobert

TypeORMを複数のデータベースとormconfig.jsonそして、それは私にはまったくうまくいきませんでした。常にdefault接続を使用しているようで、デフォルト(=明示的な名前のない)接続が見つからない場合、対応するエラーがスローされました。

app.module.ts代わりに(私はormconfig.json):

imports: [
  ...,
  TypeOrmModule.forRoot({
    name: 'Project1',
    type: 'mysql',
    Host: 'localhost',
    port: 3306,
    username: '<username>',
    password: '<pwd>',
    database: '<database>',
    synchronize: false,
    entities: ['project1/*.entity.ts'],
    subscribers: ['project1/*.subscriber.ts'],
    migrations: ['project1/migrations/*.ts'],
    cli: { migrationsDir: 'project1/migrations' },
  }),
  TypeOrmModule.forRoot({
    name: 'project2',
    type: 'mysql',
    Host: 'localhost',
    port: 3306,
    username: '<another-username>',
    password: '<another-pwd>',
    database: '<another-database>',
    synchronize: false,
    entities: ['project2/*.entity.ts'],
    subscribers: ['project2/*.subscriber.ts'],
    migrations: ['project2/migrations/*.ts'],
    cli: { migrationsDir: 'project2/migrations' },
  })
]
5
Kim Kern

わかりやすくするため、および他の開発者がこの投稿にアクセスする場合:

NestJSドキュメント から:

接続に名前を設定しない場合、その名前はデフォルトに設定されます。名前のない、または同じ名前の複数の接続があるべきではないことに注意してください。そうしないと、それらは単に上書きされます。

接続の1つに、次のいずれかが必要です。

  1. "name":"default"
  2. 名前なし。

すべての接続をormconfig.jsonで宣言し、コードで宣言しないことをお勧めします。

ormconfig.jsonから接続をインポートする例:

@Module({
    imports: [TypeOrmModule.forFeature([Entity1, Entity2]), //This will use default connection
    TypeOrmModule.forRoot({name: 'con1'}), // This will register globaly con1
    TypeOrmModule.forRoot({name: 'con2'}), // This will register globaly con2
    controllers: [...],
    providers: [...],
    exports: [...]
})

モジュール内(ルートモジュールである必要はなく、接続が必要なモジュールのみ)。

1
o.Nassie

複数のデータベース接続を使用している場合は、接続名をTypeOrmModule.forRoot({name: 'db1Connection'})内の同じレベルで明示的に渡す必要があります。

TypeOrmModule.forRootAsync({
  name: DB1_CONNECTION,
  imports: [ConfigModule],
  useClass: TypeormDb1ConfigService,
}),

TypeOrmModule.forRootAsync({
  name: DB2_CONNECTION,
  imports: [ConfigModule],
  useClass: TypeormDb2ConfigService,
})
0
Frozenex