动态数据库模块和 CONNECTION 注入令牌的用途是什么?

What's the purpose of a dynamic database module and the CONNECTION injection token?

我很难理解动态数据库模块向 AppModule 中的 TypeOrmModule 提供 'CONNECTION' 依赖注入令牌的目的是什么。

是否可以重用 AppModule 中的 TypeOrmModule 但使用不同的配置?为什么我们不能使用不同的配置直接在需要的地方直接导入 TypeOrmModule

这是来自 nestjs 基础课程。

TypeOrmModule配置在AppModule( https://github.com/jstrother/iluvcoffee/blob/5a34b0d98841f9d33d2490e7186648928303eedb/src/app.module.ts#L21-L34):

import * as Joi from '@hapi/joi';
import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CoffeesModule } from './coffees/coffees.module';
import { CoffeeRatingModule } from './coffee-rating/coffee-rating.module';
import { DatabaseModule } from './database/database.module';
import { CommonModule } from './common/common.module';

@Module({
  imports: [
    CoffeesModule,
    ConfigModule.forRoot({
      validationSchema: Joi.object({
        DATABASE_HOST: Joi.required(),
        DATABASE_PORT: Joi.number().default(5432),
      }),
    }),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: (configService: ConfigService) => ({
        type: 'postgres',
        host: configService.get('DATABASE_HOST'),
        port: +configService.get<number>('DATABASE_PORT'),
        username: configService.get('DATABASE_USER'),
        password: configService.get('DATABASE_PASSWORD'),
        database: configService.get('DATABASE_NAME'),
        autoLoadEntities: true,
        synchronize: true,
      }),
      inject: [ConfigService],
    }),
    CoffeeRatingModule,
    DatabaseModule,
    CommonModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

DatabaseModule (https://github.com/jstrother/iluvcoffee/blob/5a34b0d98841f9d33d2490e7186648928303eedb/src/database/database.module.ts):

import { DynamicModule, Module } from '@nestjs/common';
import { createConnection, ConnectionOptions } from 'typeorm';

@Module({})
export class DatabaseModule {
  static register(options: ConnectionOptions): DynamicModule {
    return {
      module: DatabaseModule,
      providers: [
        {
          provide: 'CONNECTION',
          useValue: createConnection(options),
        }
      ]
    };
  }
}

在另一个模块 (https://github.com/jstrother/iluvcoffee/blob/5a34b0d98841f9d33d2490e7186648928303eedb/src/coffee-rating/coffee-rating.module.ts) 中使用 DatabaseModule:

import { Module } from '@nestjs/common';
import { CoffeesModule } from '../coffees/coffees.module';
import { DatabaseModule } from '../database/database.module';
import { CoffeeRatingService } from './coffee-rating.service';

@Module({
  imports: [
    DatabaseModule.register(
      {
        type: 'postgres',
        host: process.env.DATABASE_HOST,
        username: process.env.DATABASE_USER,
        password: process.env.DATABASE_PASSWORD,
        port: +process.env.DATABASE_PORT,
      }
    ),
    CoffeesModule
  ],
  providers: [CoffeeRatingService]
})
export class CoffeeRatingModule {}

似乎在 CoffeeRatingModule 中使用 DatabaseModule 有点没有实际意义,因为我们已经有一个数据库连接与 AppModule 中的相同配置...我是什么不见了?

我相信核心课程向您展示了两种不同的方法(就像文档一样)。一个已经由 NestJS 构建(@nestjs/typeorm 包),一个由您构建(使用 DatabaseModule)。 DatabaseModule 方法给了你更多的自由,因为它是由你创造的,但这也意味着你要自己负责管理连接、所有的依赖标记,所有的一切,而 @nestjs/typeorm 包做了大部分对你来说,但扩展它有时会有点困难。