之前我们已经了解了一下,如果想在一个 Nest 的模块里使用其它的模块里面提供的功能,就必须要在这个模块里导入想要使用的模块。
我们的应用里面可能会有一些模块提供了一些基础功能,就是你可能要在大部分模块里使用这些模块提供的功能,在每一个模块里导入这些模块比较复杂。所以,我们可以使用 Nest 提供的全局模块功能,就是把这些常用的模块定义成一个全局模块,这样在应用的根模块导入了这个全局模块以后,在应用里的其它的模块就可以使用全局模块提供的东西了。不需要再明确的导入这些模块了。
假设我们的应用里面的这个 CoreModule 模块里的功能,在很多模块都需要,所以可以把它定义成一个全局模块。只需要在这个模块类的上面,再用一个 @Global 装饰器装饰一下它。这个装饰器来自 @nestjs/common。
打开 UserModule ,之前我们在这个模块里导入过 CoreModule 模块,这里可以先去掉这个导入。
在这个模块的 UserController 里面,注入了一个依赖的东西,就是这个 LoggerService,这个服务是 CommonModule 导出的,在 CoreModule 模块里导入了这个 CommonModule,又重新导出了 CommonModule,这样其它模块只需要导入 CoreModule,就可以使用 CommonModule 提供的功能了。
在下面这个 getUser 方法里面,用了一下这个 LoggerService 上的 log 方法,输出了一条信息,UserController: getUser。
下面再打开 AppModule,这是应用的 root 模块,在使用命令创建 CommonModule 还有 CoreModule 模块的时候,自动在这个模块里导入了这两个模块。我们可以删除掉 CommonModule 模块的导入,只需要导入 CoreModule 模块,这个模块是一个全局模块,所以在 root 模块里导入了这个模块以后,在其它的模块里面就可以使用这个模块提供的功能了。
预览
打开一个 Http 客户端,可以试一下,请求 profile 这个地址,再回到运行项目开发服务的终端观察一下。这里会输出一条 UserController: getUser。 这条信息是用 LoggerService 提供的功能输出的。
在 UserController 这个控制器所属的 UserModule 模块里面,并没有导入 CoreModule 模块,我们只在应用的 root 模块,也就是 AppModule 模块里导入了这个 CoreModule,因为它是一个全局模块,所以在 root 模块里导入之后,在应用的其它模块里面不需要导入也可以使用全局模块提供的功能。