Nest框架中重要概念 => 模块
模块是具有 @Module() 装饰器的类
在项目中,有一个主模块(app.module.ts文件)
,其他功能模块都是通过imports
属性来导入到主模块
这样只需在入口文件(main.ts文件)
创建主模块就行,所有模块就都创建了
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
@module()配置
@module()
装饰器接受一个描述模块属性的对象
配置 | |
---|---|
providers | 由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享 |
controllers | 必须创建的一组控制器 |
imports | 导入模块的列表,这些模块导出了此模块中所需提供者 |
exports | 由本模块提供并应在其他模块中可用的提供者的子集。 |
例如:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserController } from './user/user.controller';
import { UserService } from './user/user.service';
import { UserModule } from './user/user.module';
@Module({
imports: [UserModule],
controllers: [AppController, UserController],
providers: [AppService, UserService],
})
export class AppModule {}
功能模块
上面例子中UserController
和 UserService
属于同一个应用程序域,应该将他们移动到一个功能模块下
// user/user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
要使用 CLI 创建模块,只需执行 $ nest g module user
命令
$ nest g module user
较完整的功能模块结构
src
├──user
│ ├──dto
│ │ └──create-user.dto.ts
│ ├──interfaces
│ │ └──user.interface.ts
│ ├─user.service.ts
│ ├─user.controller.ts
│ └──user.module.ts
├──app.module.ts
└──main.ts
共享模块
每个模块都是一个共享模块。一旦创建就能被任意模块重复使用
共享模块原理就是 (导出自己的模块和导出导入的模块)
@Module
装饰器中的exports
配置项,用于导出
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
imports: [CommonModule],
controllers: [UserController],
providers: [UserService,CommonModule],
// 在 exports 属性中的模块,可以导出
exports: [UserService]
})
export class UserModule {}
全局模块
如果要在多个地方导入相同的模块,操作很繁琐,但是将模块变成全局模块,就可以解决这个问题
@Global
装饰器使模块成为全局作用域
import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Global()
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService],
})
export class CatsModule {}
动态模块
动态模块可以创建,可自定义的模块
允许在运行时,动态地为模块添加或修改提供者和导出
动态模块是 Nest.js 中一种特殊的模块,它允许在运行时动态地为模块添加或修改提供者和导出。
import { Module, DynamicModule } from '@nestjs/common';
// 引入一个可创建提供者的方法
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';
@Module({
providers: [Connection],
})
export class DatabaseModule {
// 静态方法 `forRoot()`
static forRoot(entities = [], options?): DynamicModule {
const providers = createDatabaseProviders(options, entities);
return {
module: DatabaseModule,
providers: providers,
exports: providers,
};
}
}
DatabaseModule
还定义了一个静态方法forRoot()
,该方法返回一个动态模块。forRoot()
方法接受两个可选参数:entities
和options
,用于为数据库连接提供必要的配置信息和实体定义。在
forRoot()
方法中,我们使用createDatabaseProviders()
函数来创建数据库提供者,并将其添加到providers
数组中。该函数接受options
和entities
参数,并基于它们来创建数据库提供者。然后,我们将提供者数组作为返回值传递给动态模块的providers
和exports
属性中,以便其他模块可以使用这些提供者。
转载自:https://juejin.cn/post/7244192848064167997