在 Nest 的模块里,配置了 providers 以后,属于这个模块的东西就可以使用这些 Provider 提供的东西了。如果你想在其它模块里,使用这个模块里面提供的一些功能,需要把它们放在模块的 exports 里面,就是导出模块提供的功能,或者叫公开模块提供的功能。如果想在模块里使用其它的模块提供的功能,需要把这些提供功能的模块放在模块的 imports 里面。
下面我们再创建一个模块,在终端,项目所在目录的下面,执行 nest generate 生成一个 module ,放在 modules 的下面,模块的名字是 auth,假设这是一个处理用户身份验证的模块。可以再给这个模块生成一个控制器,generate 一个 controller ,还需要一个服务,generate 一个服务。
现在我需要在 AuthService 服务里面,用到 UserService 服务里提供的功能。
这就需要先在 UserService 所属的模块里面,导出 UserService,然后在 AuthService 所属的模块里导入 UserService 所属的模块。
打开 UserModule 模块,在定义模块的 Module 装饰器的对象参数里,再添加一个 exports ,它的值是个数组,里面的东西就是这个模块可以对外提供的功能。添加一个 UserService,这样如果在其它的模块里面,导入了这个 UserModule 模块,就可以使用这个模块里面的 UserService 提供的功能了。
然后再打开 AuthService 所属的模块,AuthModule 模块,这个模块里的 AuthService 模块用到 UserModule 模块里的 UserService,所以这里要在定义 AuthModule 模块的 @Module 装饰器提供的对象参数里面,再添加一个 imports,它的值是一个数组,数组里的项目就是要导入的模块。添加一个 UserModule 。
现在我们就可以在 AuthModule 模块里包含的东西里面使用 UserModule 模块提供的功能了,比如使用它的 UserService 。
打开 AuthService,给它添加一个构造方法,constructor,通过这个构造方法给它注入一个依赖,添加一个参数属性,private readonly 参数属性的名字是 userService,类型是 UserService。
然后可以用一下注入到 AuthService 里的 UserService 依赖上提供的东西。
在这个构造方法里面,用一个 console.log,先输出一个 AuthService,后面加上执行 this.userService.getUser 这个方法返回的结果。
tslint 提示我们不让使用 console.log,可以修改一下 tslint 的配置,打开 tslint.json,在 rules 里面,添加一个 no-console,把它设置成 false。
回到运行项目开发服务的终端,检查一下。你会发现,这里输出了一个 AuthService,后面还有一个 ninghao 。
这就说明,在 AuthModule 模块的 AuthService 里面,成功的使用了来自 UserModule 模块的 UserService 服务上提供的功能。