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 会:
- 检查
CatsService
是否已经在providers
中注册; - 自动创建并注入实例;
- 管理生命周期(默认是单例)。
这使得你的代码松耦合、高可测试性。
🚀 延伸:跨模块注入服务(使用 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)和请求参数装饰器的用法。