当前位置: 首页 > news >正文

NestJS 系列教程(二):模块化架构与依赖注入机制详解

🧩 NestJS 系列教程(二):模块化架构与依赖注入机制详解

✨ 本篇目标

在本章你将学会:

  • Nest 中模块(Module)的作用与使用方法
  • 如何组织多个模块
  • Nest 的依赖注入机制是如何工作的
  • 如何注册并使用自定义服务

📦 什么是模块(Module)?

在 Nest 中,模块是组织代码的基本单元。每个功能领域应被封装在自己的模块中。

官方建议:每个模块都应该聚焦于一类职责或功能领域,如:用户模块、商品模块、订单模块等。

模块的核心结构:

@Module({imports: [],controllers: [],providers: [],exports: [],
})
export class XxxModule {}

🎯 创建一个新的模块与服务

我们通过 CLI 创建一个 cats 模块:

nest g module cats
nest g service cats
nest g controller cats

生成的结构:

src/
├── cats/
│   ├── cats.module.ts
│   ├── cats.service.ts
│   ├── cats.controller.ts

🧱 cats.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';@Module({controllers: [CatsController],providers: [CatsService],
})
export class CatsModule {}
  • controllers:声明控制器
  • providers:声明服务,供控制器或其他服务注入使用

🧠 cats.service.ts

import { Injectable } from '@nestjs/common';@Injectable()
export class CatsService {getCats(): string[] {return ['Tom', 'Garfield', 'Kitty'];}
}
  • @Injectable():标记此类可以被依赖注入
  • 逻辑简单,返回一组猫猫的名字

🌐 cats.controller.ts

import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';@Controller('cats')
export class CatsController {constructor(private readonly catsService: CatsService) {}@Get()findAll(): string[] {return this.catsService.getCats();}
}
  • 使用 @Controller('cats') 来定义路由前缀 /cats
  • 在构造函数中注入 CatsService(Nest 自动完成注入)
  • @Get() 表示响应 GET /cats 请求

🔗 根模块中引入 CatsModule

app.module.ts 中添加:

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';@Module({imports: [CatsModule],
})
export class AppModule {}

🧪 测试结果

运行项目:

npm run start

访问浏览器:

http://localhost:3000/cats

响应结果:

["Tom", "Garfield", "Kitty"]

🧠 依赖注入(DI)原理概览

Nest 的依赖注入容器自动处理类之间的依赖关系。

当你通过构造函数注入一个服务时,如下:

constructor(private readonly catsService: CatsService) {}

Nest 会:

  1. 检查 CatsService 是否已经在 providers 中注册;
  2. 自动创建并注入实例;
  3. 管理生命周期(默认是单例)。

这使得你的代码松耦合、高可测试性。


🚀 延伸:跨模块注入服务(使用 exports)

如果你希望在其他模块中使用 CatsService,你需要:

修改 cats.module.ts

@Module({controllers: [CatsController],providers: [CatsService],exports: [CatsService], // 👈 导出服务
})

在另一个模块中引入 CatsModule

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';@Module({imports: [CatsModule], // 👈 导入模块
})
export class DogsModule {}

这样你就可以在 DogsModule 中注入 CatsService 了。


✅ 小结

本篇我们学习了:

  • Nest 模块系统的结构与作用
  • 如何使用 CLI 快速创建模块、控制器、服务
  • 服务注册与依赖注入机制
  • 跨模块共享服务的方法

🔮 下一篇预告

第3篇:构建 RESTful API —— 路由、DTO 与请求处理

我们将构建带有参数校验的 POST 接口,介绍 DTO(数据传输对象)、管道(Pipes)和请求参数装饰器的用法。

http://www.dtcms.com/a/266019.html

相关文章:

  • WPS 如何使用宏录制功能
  • Qt的前端和后端过于耦合(0/7)
  • 匹配一切 学习笔记2025
  • Doris 数据导入性能优化全攻略:深度诊断与全面提速指南
  • 封装 获取paramsByKey 方法
  • Unity-MMORPG内容笔记-其一
  • 【tensorflow2.6.0 一系列相关报错记录】
  • 踩坑日记:虚拟机桥接模式无法连接网卡
  • Intellij IDEA中Maven的使用
  • 学习C++、QT---17(C++ 记事本项目的雏形实现)
  • 深度学习1(深度学习和机器学习的区别,神经网络)
  • JNI实现Android音视频播放器的设计方案
  • 万字长文 探索 AI 智能体:架构设计与实际应用
  • Compose 常用命令详解——AI教你学Docker
  • Spring Cloud(微服务部署与监控)
  • P1073 [NOIP 2009 提高组] 最优贸易
  • qiankun - 微前端
  • 从0开始学习R语言--Day37--CMH检验
  • 基于InVEST模型生境质量评估、基于SoLVES社会价值评估、耦合度分析
  • 二位差分矩阵
  • L2CAP协议详解:分段重组、QoS控制与多协议复用设计(面试宝典)
  • SpringBoot论坛系统安全测试实战报告
  • 深入理解 Redis Cluster:分片、主从与脑裂
  • 轮椅租赁小程序开发源码php
  • 4-6WPS JS宏自定义函数变长参数函数(实例:自定义多功能数据统计函数)学习笔记
  • 【进阶篇-消息队列】——Kafka如何实现事务的
  • 贪心专题练习
  • 伞兵 钓鱼的肝
  • 【系统如何知道每个软件该去哪个源下载】
  • spring6合集——spring概述以及OCP、DIP、IOC原则