Module
基本概念
Nest 中模块通过 @Module 装饰器声明。每个应用有一个根模块,Nest 会从根模块收集模块之间的依赖关系,构建模块依赖树,并在初始化阶段根据该依赖树实例化模块对象。
在模块树中,每个模块有独立作用域,拥有自己的:
- 控制器(Controllers)。
- 服务提供者(Providers)。
- 依赖(Imports)。
- 中间件(Middlewares)。
- 其他组件。
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
共享模块
模块之间可以共享服务。例如 Order 模块需要使用 User 模块中的 UserService。
User 模块导出服务:
@Module({
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}
Order 模块导入 User 模块:
@Module({
imports: [UserModule],
controllers: [OrderController],
providers: [OrderService],
})
export class OrderModule {}
在 OrderService 中即可使用 UserService:
@Injectable()
export class OrderService {
@Inject(UserService)
private userService: UserService;
findOne(id: number) {
return this.userService.findOne(id);
}
}
全局模块
通过 @Global() 装饰器声明模块为全局模块,一次导入即可全局使用,无需在每个模块中重复导入。
@Global()
@Module({
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule {}
Order 模块中可省略 imports: [UserModule],依然可以使用 UserService。
动态模块
动态模块可以在运行时传入配置参数,动态构建模块内容。适用于如权限判断、配置中心等场景。
如下,AuthModule 声明为动态模块:
@Module({})
export class AuthModule {
static register(options: Record<string, any>): DynamicModule {
return {
module: AuthModule,
controllers: [AuthController],
providers: [
{
provide: 'CONFIG_OPTIONS',
useValue: options,
},
AuthService,
],
exports: [],
};
}
}
动态导入模块:
@Module({
imports: [
AuthModule.register({
role: 'admin',
type: 'auth',
}),
],
})
export class AppModule {}
控制器中使用传入参数:
@Controller('auth')
export class AuthController {
constructor(
private readonly authService: AuthService,
@Inject('CONFIG_OPTIONS') private readonly options: Record<string, any>,
) {}
@Get()
findAll() {
console.log(this.options);
return this.authService.findAll();
}
}
动态模块的注册函数可以自定义名称,但通常使用如下约定的几种:
| 方法名 | 说明 |
|---|---|
register | 每次使用都传入新的配置参数 |
forRoot | 配置一次,模块内部全局共享,适用于根模块配置 |
forFeature | 用于功能模块配置扩展,通常配合 forRoot 使用 |