Skip to main content

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 使用