动态数据库模块和 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
包做了大部分对你来说,但扩展它有时会有点困难。
我很难理解动态数据库模块向 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
包做了大部分对你来说,但扩展它有时会有点困难。