在 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 模块。如果你有任何进一步的问题或需要更详细的解释,请随时提问!