Skip to content
On this page

@Module

@Module 是 NestJS 框架中的一个装饰器,用于定义模块。模块是组织代码的基本单元,它们将相关的组件(如控制器、服务、提供者等)组合在一起。NestJS 的模块系统受到了 Angular 的启发,旨在促进代码的模块化和可维护性。

核心概念

  1. 模块装饰器 (@Module)

    • 用于标记一个类为 NestJS 模块,并提供模块的元数据。
  2. 模块元数据

    • imports: 导入的模块列表,这些模块的提供者可以在当前模块中使用。
    • controllers: 当前模块定义的控制器。
    • providers: 当前模块定义的提供者(服务等),这些提供者可以注入到模块的其他组件中。
    • exports: 当前模块提供并可以在其他模块中使用的提供者。

使用示例

以下是一个基本的模块示例:

typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

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

1
2
3
4
5
6
7
8
9
10
11

在这个示例中:

  • @Module 装饰器定义了 AppModule 类为一个模块。
  • imports 数组为空,表示没有导入其他模块。
  • controllers 数组包含了 AppController,这是一个控制器。
  • providers 数组包含了 AppService,这是一个提供者(服务)。

模块的详细示例

下面是一个更复杂的示例,展示了如何使用多个模块、控制器和服务:

  1. 创建用户模块
typescript
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],
})
export class UsersModule {}

1
2
3
4
5
6
7
8
9
10
11
  1. 创建用户控制器
typescript
import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
  1. 创建用户服务
typescript
import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  private readonly users = [{ id: 1, name: 'John Doe' }];

  findAll() {
    return this.users;
  }
}

1
2
3
4
5
6
7
8
9
10
11
  1. 在应用模块中导入用户模块
typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';

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

1
2
3
4
5
6
7
8
9
10
11
12

模块元数据详解

  • imports

    • 导入其他模块,使得这些模块的提供者可以在当前模块中使用。模块之间的依赖通过 imports 数组进行管理。
    • 示例:
      @Module({
        imports: [UsersModule],
      })
      export class AppModule {}
      
      
      1
      2
      3
      4
      5
  • controllers

    • 当前模块定义的控制器。这些控制器负责处理传入的请求并返回响应。
    • 示例:
      @Module({
        controllers: [AppController],
      })
      export class AppModule {}
      
      
      1
      2
      3
      4
      5
  • providers

    • 当前模块定义的提供者。这些提供者可以是服务、工厂、或其他可以注入的依赖。
    • 示例:
      @Module({
        providers: [AppService],
      })
      export class AppModule {}
      
      
      1
      2
      3
      4
      5
  • exports

    • 导出当前模块的提供者,使其可以在其他模块中使用。
    • 示例:
      @Module({
        providers: [AppService],
        exports: [AppService],
      })
      export class AppModule {}
      
      
      1
      2
      3
      4
      5
      6

总结

@Module 是 NestJS 框架中用于定义模块的装饰器。通过模块,开发者可以将相关的控制器、服务和其他组件组织在一起,提高代码的模块化和可维护性。模块的 importscontrollersprovidersexports 元数据属性使得模块之间可以相互依赖和协作,形成一个高内聚、低耦合的应用架构。

沪ICP备20006251号-1