回到运行项目开发服务的终端可以观察一下。你会发现,这里出现了一些错误提示,说 Nest can't resolve dependencies of the AppService 。Nest 不能解决 AppService 这个服务的依赖。
后面又提示说要确定在 AppService 这个类的构造方法里的排在第一位置上的这个参数,也就是 LoggerService 这个依赖,在 AppModule 这个模块里是可用的。index[0] 表示索引号是 0 的参数,就是排在第一位置上的参数。因为在一个数组里面,数据项目的索引号或者叫序号是从 0 开始的。
下面还给出了两种解决方法,首先,可以先确定一下,如果 LoggerService 是个 Provider ,它是否属于 AppModule 这个模块的一部分。
或者如果这个 LoggerService 是其它模块导出的东西,要确定一下这个模块是不是已经在 AppModule 模块里被导入了。
现在我们的应用里面只有一个模块,就是 AppModule 模块,可以先让 LoggerService 这个 Service Provider 作为这个模块的一部分。
配置 Provider
这就需要再配置一下 AppModule 这个模块。打开定义这个模块的文件,在给 @Module 装饰器提供的对象参数里面,添加一个 providers 属性,它的值是个数组,数组里的项目就是这个模块包含的一些 Provider 。
这里暂时已经有了一个项目,就是 AppService,这其实是一种简单的写法,因为每个 Provider 都需要一个名字,英文是 token,还有一个对应的值。
这种简单的写法的意思就是,Provider 的名字,也就是它的 token 是 AppService,对应的值是 AppService 这个类。
这样如果有地方使用这个 token 值注入依赖,Nest 发现跟这个 token 对应的东西是个类,就会去创建一个这个类的实例,或者如果这个类的实例已经存在了,就会获取到这个实例,再把它注入到对应的类里面。其实就是把依赖的东西交给类里面的一个属性。
如果不用这种简单的写法,配置模块的 Provider 要这样,先添加一个对象,在这个对象里添加一个 provide 属性,它的值是一个 Injection token,也就是在注入依赖的时候要使用的一个名字,或者叫代号。
这里把它设置成 LoggerService,对应的值是一个类,可以再添加一个 useClass,它的值是一个类,用一下 LoggerService 。这就是标准的配置 Provider 的方法。
保存一下文件,再回到运行项目开发服务的终端,这次你会发现,之前的错误提示就不见了。
预览
再找一个 Http 客户端,请求一下应用的根,服务端响应回来的是一个字符串,Hello World 。回到终端,你会发现,这里输出了一个 AppService:Hello World!
请求是用 AppController 控制器的 getHello 方法处理的,这个方法里用了 appService 上的 getHello 方法。用的这个 AppService 是作为这个控制器的依赖注入进来的。
在 AppService 这个 Service Provider 里面,也需要一个依赖,就是这个 LoggerService,把它注入进来以后,在这个 getHello 方法用了一下它上面的 log 方法,输出了一条信息。
请求应用的根,使用 AppController 的 getHello 方法处理,在这个方法里,用了注入进来的 AppService 服务上的 getHello 方法,在这个 Service Provider 的 getHello 方法里,又用了一下注入进来的 LoggerService 上的 log 方法,在控制台上输出了一条信息。