nest.js 动态模块

纵然是瞬间 提交于 2020-02-28 00:58:30

我理解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()读取配置信息。


nestjs动态模块文档

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!