什么是模块?
在Nestjs中,模块是用于将相关代码分组在一起的基本组织单元。他们在构建应用程序和促进模块化方面发挥着至关重要的作用,使管理和扩展大型项目变得更容易。
在其核心上,模块是用 @Module()
装饰器注释的打字稿类。该装饰器提供了定义模块及其属性的元数据。 Nestjs中模块的一个简单说明如下:
-
分组代码:模块通过将相关组件,控制器,服务和其他功能分组在一起来帮助组织代码。例如,如果您具有与用户相关的功能,则可以创建一个
UserModule
来封装所有与用户相关的逻辑。 - 依赖关系边界:Nestjs中的每个模块都充当依赖边界。这意味着模块中的组件可以相互访问而无需明确导入它们。但是,必须明确导入其他模块的组件。
-
范围:模块为其中的组件提供范围。默认情况下,模块中声明的组件(提供商)仅在该模块中可用。如果要在多个模块之间共享一个组件,则可以在
exports
属性中使用@Module()
decorator。 - root模块:根模块是应用程序的入口点,您可以在其中引导Nestjs应用程序并定义将加载的初始模块集。
这是简单的Nestjs模块的基本示例:
// 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 {}
在此示例中,我们有一个 UserModule
,其中包括控制器 UserController
和服务 UserService
。按照惯例,模块文件用 .module.ts
后缀,并且将所有与用户相关的功能封装在一个地方。
要在根模块中使用此模块(例如, AppModule
),您会这样导入它:
// app.module.ts
import { Module } from '@nestjs/common';
import { UserModule } from './user/user.module';
@Module({
imports: [UserModule],
})
export class AppModule {}
通过将 UserModule
导入到 AppModule
中,我们将在整个应用程序中提供 UserModule
中的所有组件。这就是Nestjs中模块的本质:组织,范围和构建应用程序的代码库。
创建模块
要在Nestjs中创建模块,您可以按照以下步骤操作:
- 生成一个新的模块:您可以使用Nest CLI使用以下命令生成新模块:
nest generate module <module-name>
<module-name>
用要给模块的名称替换。例如,如果要创建一个用于处理用户的模块,则可以运行:
nest generate module user
这将创建一个名为 user
的新文件夹,其中包含模块的必要文件。
-
定义一个模块类:在新生成的模块文件夹中,您会发现一个
<module-name>.module.ts
文件。打开此文件并使用@Module()
装饰器来定义模块。您可以在此装饰器中导入并声明控制器,服务和其他模块。
// 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 {}
创建组件:在模块中,您可以创建控制器,服务和其他组件。例如:
// user.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UserController {
@Get()
findAllUsers() {
// Logic to fetch all users
return 'All users';
}
}
// user.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {
findAllUsers() {
// Logic to fetch all users from a database or any other source
return ['User 1', 'User 2', 'User 3'];
}
}
导入模块:要在应用程序中使用模块,您需要将其导入根模块( AppModule
)。打开 app.module.ts
文件,然后使用 imports
在 @Module()
< /strong>装饰器。
// app.module.ts
import { Module } from '@nestjs/common';
import { UserModule } from './user/user.module';
@Module({
imports: [UserModule],
})
export class AppModule {}
bootstrap应用程序:最后,您需要用根模块引导Nestjs应用程序。这通常发生在 main.ts
文件中。
// 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();
就是这样!现在,您已成功创建并集成了一个模块到Nestjs应用程序中。您可以重复该过程,为应用程序的不同部分创建其他模块,使其更有条理和可维护。
导入模块
步骤1:安装Nestjs并创建一个新项目
npm install -g @nestjs/cli
nest new task-manager-app
cd task-manager-app
步骤2:创建一个任务模块
nest generate module tasks
步骤3:创建一个任务控制器
nest generate controller tasks
步骤4:创建任务服务
nest generate service tasks
步骤5:定义任务数据接口
在 tasks
文件夹中创建一个名为 task.interface.ts
的文件。该界面将定义任务的结构。
// tasks/task.interface.ts
export interface Task {
id: number;
title: string;
description: string;
completed: boolean;
}
步骤6:实施任务服务
打开 tasks.service.ts
文件,并实施服务以管理任务。我们将使用临时数组来存储任务以简单。
// tasks/tasks.service.ts
import { Injectable } from '@nestjs/common';
import { Task } from './task.interface';
@Injectable()
export class TasksService {
private tasks: Task[] = [];
getAllTasks(): Task[] {
return this.tasks;
}
createTask(title: string, description: string): Task {
const id = this.tasks.length + 1;
const newTask: Task = {
id,
title,
description,
completed: false,
};
this.tasks.push(newTask);
return newTask;
}
}
步骤7:实施任务控制器
打开 tasks.controller.ts
文件并实现控制器来处理与任务相关的HTTP请求。
// tasks/tasks.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { TasksService } from './tasks.service';
import { Task } from './task.interface';
@Controller('tasks')
export class TasksController {
constructor(private readonly tasksService: TasksService) {}
@Get()
getAllTasks(): Task[] {
return this.tasksService.getAllTasks();
}
@Post()
createTask(@Body('title') title: string, @Body('description') description: string): Task {
return this.tasksService.createTask(title, description);
}
}
步骤8:进口 tasks.controller.ts
和 tasks.service.ts
to to New TasksModule
// tasks/tasks.module.ts
import { Module } from '@nestjs/common';
import { TasksController } from './tasks.controller';
import { TasksService } from './tasks.service';
@Module({
controllers: [TasksController],
providers: [TasksService],
})
export class TasksModule {}
步骤9:导入任务模块
现在,将 TasksModule
导入主要应用程序模块( app.module.ts
)。
// app.module.ts
import { Module } from '@nestjs/common';
import { TasksModule } from './tasks/tasks.module';
@Module({
imports: [TasksModule], // Import the TaskModule here
})
export class AppModule {}
步骤10:运行应用程序
最后,使用以下命令运行应用程序:
npm run start:dev
您的Nestjs任务管理器应用程序现在正在运行。您可以使用Postman之类的工具将HTTP请求发送到 http://localhost:3000/tasks
并与您的任务管理器应用程序进行交互。
使用此更新的代码,我们使用了任务模块来组织与任务相关的组件和服务。该模块封装了管理任务的所有逻辑,并为应用程序提供了干净的模块化结构。
导出模块
在Nestjs中,导出一个模块允许您制作其组件(控制器,服务等),可用于其他模块以导入和使用。通过导出模块,您本质上可以使其在应用程序的不同部分中访问和重复使用。
要导出Nestjs中的模块,您需要按照以下步骤操作:
步骤1:创建模块
首先,创建要导出的模块。您可以通过使用Nestjs CLI生成新模块或手动创建模块所需的文件来做到这一点。
例如,假设我们要创建一个用于管理用户的简单模块:
nest generate module users
此命令将生成 users
文件夹,并带有模块的必要文件: users.module.ts
, users.controller.ts
, users.service.ts
,等等。
步骤2:定义模块
在 users.module.ts
文件(或您创建的模块文件)中,使用 @Module()
Decorator定义模块:
// users/users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService], // <-- Export the service (or any other component you want to make available outside this module)
})
export class UsersModule {}
在此示例中,我们将从 UsersService
中导出 UsersModule
。这意味着其他模块将能够通过导入 UsersModule
。
步骤3:在其他地方导入模块
现在,您可以在要使用导出的组件的任何其他模块中导入 UsersModule
:
// some-other-module.ts
import { Module } from '@nestjs/common';
import { UsersModule } from './path/to/users.module'; // <-- Import the UsersModule
@Module({
imports: [UsersModule], // Import the UsersModule here to use its exported components
})
export class SomeOtherModule {}
通过将 UsersModule
导入 SomeOtherModule
,您现在可以访问并使用 UsersService
UsersModule
。
请记住,您要在其他模块中提供的任何组件(服务,控制器等)都必须在模块的 exports
array中明确导出。
就是这样!现在,您知道如何在Nestjs中导出一个模块,使其组件可用于应用程序的其他部分。这种模块化方法有助于保持您的代码井井有条,促进可重复性,并使您在应用程序不同部分之间更容易管理依赖关系。