我理解nestjs动态模块主要是为模块注解提供运行时获得动态信息的能力,例如配置信息
在typescript编译为js后,typescript的注解实际为一个在文件加载时候的代码,如果我们希望读取配置文件信息,然后提供给模块配置,那么这个时候访问配置信息会是null,因为注解生成的代码会在我们执行读取配置信息代码之前。
例如我们需要读取mongodb的链接字符
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mongodb',
useNewUrlParser: true,
useUnifiedTopology: true,
url: Config.DB, // 读取数据库配置
entities: [join(__dirname, '../**/**.entity{.ts,.js}')\], // 扫描整个目录
synchronize: true,
}),
],
providers: [],
controllers: \[],
exports: [],
}
class DBModule {
}
这种静态方式的注解,Config.DB 会是null,因为编译后注解代码会在读取配置信息前执行。
nestjs采取一个静态方法,返回DynamicModule类型对象,在注解上调用这个方法实现动态模块。
@Module({})
class DBModule {
// 使用nestjs动态模块, 读取配置文件,注册module的时候需要调用register()
static register(): DynamicModule {
InitConfig(); // 读取配置信息
return {
imports: [
TypeOrmModule.forRoot({
type: 'mongodb',
useNewUrlParser: true,
useUnifiedTopology: true,
url: Config.DB, // 读取数据库配置
entities: [join(__dirname, '../**/**.entity{.ts,.js}')], // 扫描整个的目录
synchronize: true,
}),
TypeOrmModule.forFeature([]),
],
module: CoreModule,
providers: [],
exports: [],
};
}
}
以动态模块方式,在其他模块import这个DBModule的时候就可以运行 InitConfig()读取配置信息。
来源:oschina
链接:https://my.oschina.net/formatkm/blog/3159418