下面我们可以在应用里添加一个功能模块,使用 Nest 提供的命令行工具,可以非常方便的生成一个模块。在终端,项目所在目录的下面,执行 nest generate,生成一个 module,就是模块,把这个模块放在 modules 目录的下面,模块的名字叫 user。 执行一下。
这条命令会生成一个模块文件,放在了 src/modules/user 这个目录的下面,生成模块的命令还自动更新了一下 AppModule 模块。打开定义这个模块的文件,你会发现,在这个模块的 imports 里面,添加了一个 UserModule 模块,这个模块就是刚才我们用命令生成的。
然后打开 UserModule 模块,定义模块的这个类需要使用 @Module 装饰器装饰。模块需要的功能,包含的东西,还有它提供的功能,都要在这个 @Module 装饰器的对象参数里配置一下。
下面我们给这个模块添加一些资源,比如控制器还有服务。在终端,执行 nest generate 生成一个 controller,放在 modules 里面,名字是 user 。
再生成一个服务,nest generate 一个 service,放在 modules/user 里面。
回到项目,打开 UserModule 模块观察一下,你会发现这个模块里面,已经自动配置好了它包含的一些资源,这是 nest 命令帮我们更新的。
在模块的 controllers 里面,已经添加好了一个 UserController 控制器。 另外在 providers 里面,也配置好了一个 Provider,就是这个 UserService,这样在这个模块里面,就可以把这个 UserService 作为其它类的依赖注入进去。比如在 UserController 控制器里面,如果需要 UserService 里提供的功能,就可以把它作为 UserController 的依赖注入进来。
示例
打开 UserService,在这个服务里添加一个方法,名字是 getUser,这个方法做的事情可以先简单的 return 一个字符串,ninghao。
然后打开 UserController 控制器,定义这个控制器用了 @Controller 装饰器,给这个装饰器提供了一个参数值,这个值会作为这个控制器里定义的路由地址的一个前缀。暂时先去掉给它的这个参数值,
在控制器里定义一条支持 HTTP 的 GET 方法请求的路由,用 @Get 这个装饰器,地址是 profile,请求它的时候,用 getUser 方法来处理。
在这个控制器里我需要使用 UserService 提供的服务,可以把它注入进来,添加一个 constructor ,在这个构造方法里,添加一个参数属性,private readonly userService,类型设置成 UserService。
然后在这个 getUser 方法里面,return 的值,可以用一下 this.userService 上的 getUser 这个方法。
预览
打开一个 Http 客户端,请求一下 profile 这个地址,响应回来的东西是一个字符串,这个响应回来的值是在 UserController 的 getUser 方法里,使用 UserService 服务上的 getUser 方法得到的。