探索Nestjs模块:综合指南
#javascript #node #nestjs #modules

什么是模块?

在Nestjs中,模块是用于将相关代码分组在一起的基本组织单元。他们在构建应用程序和促进模块化方面发挥着至关重要的作用,使管理和扩展大型项目变得更容易。

在其核心上,模块是用 @Module() 装饰器注释的打字稿类。该装饰器提供了定义模块及其属性的元数据。 Nestjs中模块的一个简单说明如下:

  1. 分组代码:模块通过将相关组件,控制器,服务和其他功能分组在一起来帮助组织代码。例如,如果您具有与用户相关的功能,则可以创建一个 UserModule 来封装所有与用户相关的逻辑。
  2. 依赖关系边界:Nestjs中的每个模块都充当依赖边界。这意味着模块中的组件可以相互访问而无需明确导入它们。但是,必须明确导入其他模块的组件。
  3. 范围:模块为其中的组件提供范围。默认情况下,模块中声明的组件(提供商)仅在该模块中可用。如果要在多个模块之间共享一个组件,则可以在 exports 属性中使用 @Module() decorator。
  4. 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中创建模块,您可以按照以下步骤操作:

  1. 生成一个新的模块:您可以使用Nest CLI使用以下命令生成新模块:
nest generate module <module-name>

<module-name> 用要给模块的名称替换。例如,如果要创建一个用于处理用户的模块,则可以运行:

nest generate module user

这将创建一个名为 user 的新文件夹,其中包含模块的必要文件。

  1. 定义一个模块类:在新生成的模块文件夹中,您会发现一个 <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中导出一个模块,使其组件可用于应用程序的其他部分。这种模块化方法有助于保持您的代码井井有条,促进可重复性,并使您在应用程序不同部分之间更容易管理依赖关系。