热搜:前端 nest neovim nvim

Nest框架中重要概念 => 模块

lxf2023-06-16 03:00:58

模块是具有 @Module() 装饰器的类

在项目中,有一个主模块(app.module.ts文件),其他功能模块都是通过imports属性来导入到主模块

Nest框架中重要概念 => 模块

这样只需在入口文件(main.ts文件)创建主模块就行,所有模块就都创建了

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

@module()配置

@module() 装饰器接受一个描述模块属性的对象

配置
providers由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享
controllers必须创建的一组控制器
imports导入模块的列表,这些模块导出了此模块中所需提供者
exports由本模块提供并应在其他模块中可用的提供者的子集。

例如:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserController } from './user/user.controller';
import { UserService } from './user/user.service';
import { UserModule } from './user/user.module';

@Module({
  imports: [UserModule],
  controllers: [AppController, UserController],
  providers: [AppService, UserService],
})
export class AppModule {}

功能模块

上面例子中UserController 和 UserService 属于同一个应用程序域,应该将他们移动到一个功能模块下

// user/user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';

@Module({
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

要使用 CLI 创建模块,只需执行 $ nest g module user 命令

$ nest g module user

较完整的功能模块结构

src
├──user
│    ├──dto
│    │   └──create-user.dto.ts
│    ├──interfaces
│    │     └──user.interface.ts
│    ├─user.service.ts
│    ├─user.controller.ts
│    └──user.module.ts
├──app.module.ts
└──main.ts

共享模块

每个模块都是一个共享模块。一旦创建就能被任意模块重复使用

共享模块原理就是 (导出自己的模块和导出导入的模块)

@Module装饰器中的exports配置项,用于导出

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';

@Module({
  imports: [CommonModule],
  controllers: [UserController],
  providers: [UserServiceCommonModule],
  // 在 exports 属性中的模块,可以导出
  exports: [UserService]
})
export class UserModule {}

全局模块

如果要在多个地方导入相同的模块,操作很繁琐,但是将模块变成全局模块,就可以解决这个问题

@Global 装饰器使模块成为全局作用域

import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global()
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}

动态模块

动态模块可以创建,可自定义的模块

允许在运行时,动态地为模块添加或修改提供者和导出

动态模块是 Nest.js 中一种特殊的模块,它允许在运行时动态地为模块添加或修改提供者和导出。

import { Module, DynamicModule } from '@nestjs/common';
// 引入一个可创建提供者的方法
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';

@Module({
  providers: [Connection],
})
export class DatabaseModule {
  // 静态方法 `forRoot()`
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}

DatabaseModule 还定义了一个静态方法 forRoot(),该方法返回一个动态模块。forRoot() 方法接受两个可选参数:entitiesoptions,用于为数据库连接提供必要的配置信息和实体定义。

forRoot() 方法中,我们使用 createDatabaseProviders() 函数来创建数据库提供者,并将其添加到 providers 数组中。该函数接受 optionsentities 参数,并基于它们来创建数据库提供者。然后,我们将提供者数组作为返回值传递给动态模块的 providersexports 属性中,以便其他模块可以使用这些提供者。

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!