11_nest.js模块

简介: 11_nest.js模块

每个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 {}

以上,动态模块就配置完毕了

目录
相关文章
|
2月前
|
缓存 JSON JavaScript
Node.js模块系统
10月更文挑战第4天
43 2
|
2月前
|
JavaScript 应用服务中间件 Apache
Node.js Web 模块
10月更文挑战第7天
33 0
|
2月前
|
JavaScript 网络协议
Node.js 工具模块
10月更文挑战第7天
21 0
|
4月前
|
JavaScript 数据可视化
JS如何优雅的实现模块自动滚动展示
【8月更文挑战第22天】JS如何优雅的实现模块自动滚动展示
50 1
JS如何优雅的实现模块自动滚动展示
|
2月前
|
JavaScript 前端开发 应用服务中间件
Node.js Web 模块
Node.js Web 模块
|
3月前
Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter
这篇文章介绍了在Nest.js构建应用时,如何通过事件/发布-订阅模式使应用程序更健壮、灵活、易于扩展,并简化服务间通信。文章主要围绕@nestjs/event-emitter模块展开,这是一个基于eventemitter2库的社区模块,提供了事件发布/订阅功能,使得实现事件驱动架构变得简单。文章还介绍了如何使用该模块,包括安装依赖、初始化模块、注册EventEmitterModule、使用装饰器简化监听等。最后总结,集成@nestjs/event-emitter模块可以提升应用程序的事件驱动能力,构建出更为松耦合、易扩展且高度灵活的系统架构,是构建现代、响应迅速且具有高度解耦特性的Nest.
|
3月前
|
缓存 JavaScript 前端开发
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
35 2
|
4月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
316 1
|
4月前
|
存储 缓存 JSON
Node.js有哪些模块系统
【8月更文挑战第12天】Node.js有哪些模块系统
49 3
|
4月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
192 1