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

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

目录
相关文章
|
4月前
|
分布式计算 JavaScript 前端开发
超级实用!详解Node.js中的lodash模块和async模块
超级实用!详解Node.js中的lodash模块和async模块
|
4月前
|
JSON JavaScript 前端开发
超级实用!详解Node.js中的util模块和express模块
超级实用!详解Node.js中的util模块和express模块
|
4月前
|
JavaScript
超级实用!详解Node.js中的path模块和events模块
超级实用!详解Node.js中的path模块和events模块
|
4月前
|
JavaScript 前端开发
Node.js中的EventEmitter模块:基本概念、使用方法和常见应用场景
Node.js中的EventEmitter模块:基本概念、使用方法和常见应用场景
64 0
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
28 0
|
4月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)(下)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
26 0
|
2天前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
|
3天前
|
缓存 JavaScript 前端开发
Node.js的模块系统:CommonJS模块系统的使用
【4月更文挑战第29天】Node.js采用CommonJS作为模块系统,每个文件视为独立模块,通过`module.exports`导出和`require`引入实现依赖。模块有独立作用域,保证封装性,防止命名冲突。引入的模块会被缓存,提高加载效率并确保一致性。利用CommonJS,开发者能编写更模块化、可维护的代码。
|
17天前
|
JavaScript API
node.js之模块系统
node.js之模块系统
|
25天前
|
小程序 开发者
微信小程序“Error: xxx.js 已被代码依赖分析忽略,无法被其他模块引用”报错?
微信小程序“Error: xxx.js 已被代码依赖分析忽略,无法被其他模块引用”报错?