Appearance
@Module
@Module
是 NestJS 框架中的一个装饰器,用于定义模块。模块是组织代码的基本单元,它们将相关的组件(如控制器、服务、提供者等)组合在一起。NestJS 的模块系统受到了 Angular 的启发,旨在促进代码的模块化和可维护性。
核心概念
模块装饰器 (@Module):
- 用于标记一个类为 NestJS 模块,并提供模块的元数据。
模块元数据:
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
2
3
4
5
6
7
8
9
10
11
在这个示例中:
@Module
装饰器定义了AppModule
类为一个模块。imports
数组为空,表示没有导入其他模块。controllers
数组包含了AppController
,这是一个控制器。providers
数组包含了AppService
,这是一个提供者(服务)。
模块的详细示例
下面是一个更复杂的示例,展示了如何使用多个模块、控制器和服务:
- 创建用户模块:
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
2
3
4
5
6
7
8
9
10
11
- 创建用户控制器:
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
2
3
4
5
6
7
8
9
10
11
12
13
- 创建用户服务:
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
2
3
4
5
6
7
8
9
10
11
- 在应用模块中导入用户模块:
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
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 框架中用于定义模块的装饰器。通过模块,开发者可以将相关的控制器、服务和其他组件组织在一起,提高代码的模块化和可维护性。模块的 imports
、controllers
、providers
和 exports
元数据属性使得模块之间可以相互依赖和协作,形成一个高内聚、低耦合的应用架构。