在 NestJS 中,模块(Module)是组织应用程序结构的基本单元。每个模块都是一个 TypeScript 类,使用 @Module 装饰器来定义。模块可以包含提供者(Providers)、控制器(Controllers)、导入的其他模块(Imports)和导出的提供者(Exports)。下面详细介绍 NestJS 模块的各个部分及其用法。

1. 基本模块结构

一个基本的 NestJS 模块通常包含以下几个部分:

  • Providers:提供者是可注入的服务,通常用于处理业务逻辑。
  • Controllers:控制器处理 HTTP 请求和响应。
  • Imports:导入其他模块,以便使用它们提供的服务。
  • Exports:导出提供者,以便其他模块可以使用它们。

示例模块

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

@Module({
  // 提供者
  providers: [UserService],
  // 控制器
  controllers: [UserController],
  // 导入的模块
  imports: [],
  // 导出的提供者
  exports: [UserService],
})
export class UserModule {}

2. 提供者(Providers)

提供者是可注入的服务,通常用于处理业务逻辑。它们可以是任何类,只要使用 @Injectable 装饰器标记。

示例提供者

// user.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
  getUsers(): string[] {
    return ['John Doe', 'Jane Smith'];
  }
}

3. 控制器(Controllers)

控制器处理 HTTP 请求和响应。它们使用 @Controller 装饰器标记,并包含路由处理方法。

示例控制器

// user.controller.ts
import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  getUsers(): string[] {
    return this.userService.getUsers();
  }
}

4. 导入模块(Imports)

模块可以导入其他模块,以便使用它们提供的服务。

示例导入

假设有一个 AuthModule,它提供了 AuthService

// auth.module.ts
import { Module } from '@nestjs/common';
import { AuthService } from './auth.service';

@Module({
  providers: [AuthService],
  exports: [AuthService],
})
export class AuthModule {}

UserModule 中导入 AuthModule

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

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

5. 导出提供者(Exports)

模块可以导出提供者,以便其他模块可以使用它们。

示例导出

UserModule 中导出 UserService

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

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

6. 动态模块

动态模块允许你在运行时配置模块的行为。这对于创建可配置的模块非常有用。

示例动态模块

// config.module.ts
import { Module, DynamicModule } from '@nestjs/common';
import { ConfigService } from './config.service';

@Module({})
export class ConfigModule {
  static register(config: any): DynamicModule {
    return {
      module: ConfigModule,
      providers: [
        {
          provide: 'CONFIG',
          useValue: config,
        },
        ConfigService,
      ],
      exports: [ConfigService],
    };
  }
}

AppModule 中使用动态模块:

// app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from './config/config.module';
import { UserModule } from './user/user.module';

@Module({
  imports: [
    ConfigModule.register({
      database: 'mongodb://localhost:27017/test',
    }),
    UserModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

7. 全局模块

全局模块可以在整个应用程序中使用,而不需要在每个模块中导入。

示例全局模块

// logger.module.ts
import { Module, Global } from '@nestjs/common';
import { LoggerService } from './logger.service';

@Global()
@Module({
  providers: [LoggerService],
  exports: [LoggerService],
})
export class LoggerModule {}

AppModule 中使用全局模块:

// app.module.ts
import { Module } from '@nestjs/common';
import { LoggerModule } from './logger/logger.module';
import { UserModule } from './user/user.module';

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

总结

NestJS 模块是组织应用程序结构的基本单元,通过模块可以管理提供者、控制器、导入的其他模块和导出的提供者。模块的灵活性和可配置性使得 NestJS 应用程序易于维护和扩展。希望这些例子能帮助你更好地理解和使用 NestJS 模块。如果你有任何进一步的问题或需要更详细的解释,请随时提问!

最后修改:2024 年 11 月 22 日
如果觉得我的文章对你有用,请随意赞赏