每个nest.js项目至少包含一个模块(根模块),在较大的项目中,模块的数量也随之增多,每个模块都包含有一组相互关联的功能
共享模块
可以在模块的Module装饰器内使用exports导出以便在其他模块中使用
@Module({ controllers: [UserController], providers: [UserService], // 导出模块 exports: [UserService], })
对于通过imports导入的模块,不需要额外在providers中提供出去,providers只要将自身模块所对应的服务暴露出去即可
import { AppService } from './app.service'; import { DemoModule } from './demo/demo.module'; import { UserModule } from './user/user.module'; @Module({ // 导入模块 imports: [DemoModule, UserModule], controllers: [AppController, DemoController], providers: [AppService], })
controller里干三件事:导入类型、注入依赖、调用功能方法
import { Controller, Get, Inject } from '@nestjs/common'; import { AppService } from './app.service'; // import导入类型 import { UserService } from './user/user.service'; @Controller('api') export class AppController { constructor( // 注入依赖 private readonly userService: UserService, ) {} @Get() getHello(): string { // 调用方法 return this.userService.findAll(); } }
全局模块
可以给模块添加@Global()装饰器让其成为全局模块,不过全局模块也要进行export才能进行访问。这里我们在src目录下新建一个config文件夹,文件夹内新建一个config.module.ts文件
import { Global, Module } from '@nestjs/common'; @Global() @Module({ providers: [ { provide: 'Config', useValue: { baseURL: '/api' }, }, ], exports: [ { provide: 'Config', useValue: { baseURL: '/api' }, }, ], }) export class ConfigModule {}
这里我们导出的是一个值。同样的,在app.module.ts里注册,注意imports和controllers之间的关系
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { DemoController } from './demo/demo.controller'; import { DemoModule } from './demo/demo.module'; import { UserModule } from './user/user.module'; import { ConfigModule } from './config/config.module'; @Module({ // 注册三个模块 imports: [DemoModule, UserModule, ConfigModule], // 将以上三个模块导出的部分导入到下面的模块中 controllers: [AppController, DemoController], // 向app.controller.ts提供自己的服务 providers: [AppService], }) export class AppModule {}
接下来在demo.controller.ts中进行声明、调用即可
import { Controller, Get, Inject } from '@nestjs/common'; import { ConfigModule } from 'src/config/config.module'; import { UserService } from 'src/user/user.service'; @Controller('demo') export class DemoController { constructor( @Inject('Config') private readonly ConfigModule: ConfigModule, private readonly UserModule: UserService, ) {} @Get('one') getAll() { return this.UserModule.findAll(); // user模块的findAll方法 } @Get('two') create() { return this.ConfigModule; // { baseURL: '/api' } } }
以上,全局模块配置完毕
动态模块
动态模块的主要作用是给模块加上用户自己的参数,可以在模块中定义一个静态方法来接收这个参数
import { DynamicModule, Global, Module } from '@nestjs/common'; interface option { path: string; } @Global() @Module({}) export class ConfigModule { // 返回类型是DynamicModule,其中必须有一个module属性 static forRoot(option: option): DynamicModule { return { module: ConfigModule, // 名称同类名 providers: [ { provide: 'Config', useValue: { baseURL: '/api' + option.path }, }, ], exports: [ { provide: 'Config', useValue: { baseURL: '/api' + option.path }, }, ], }; } }
在app.module.ts里注册,注意需要调一下forRoot这个方法,传入对应参数
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { DemoController } from './demo/demo.controller'; import { DemoModule } from './demo/demo.module'; import { UserModule } from './user/user.module'; import { ConfigModule } from './config/config.module'; @Module({ imports: [DemoModule, UserModule, ConfigModule.forRoot({ path:'开枪' })], controllers: [AppController, DemoController], providers: [AppService], }) export class AppModule {}
以上,动态模块就配置完毕了