在 Node.js 的世界里,快速搭建一个 API 服务并不难,但要构建一个可维护、可测试、可扩展的大型后端系统,却需要严谨的架构设计。NestJS 正是为解决这一挑战而生。它基于 TypeScript,融合了 Angular 的装饰器思想与现代软件工程的最佳实践,通过模块化、依赖注入和清晰的分层结构,让开发者能够高效地组织代码,专注于业务逻辑本身。
从入口开始:工厂模式与应用启动
每个 NestJS 应用都有一个明确的起点——main.ts:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { config } from 'dotenv';
config();
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
这里使用 NestFactory.create() 创建应用实例,这是一种典型的工厂模式:将复杂的对象创建过程封装起来,外部只需关心“要什么”,而不必了解“怎么造”。同时,端口通过环境变量配置,并用空值合并运算符 ?? 提供默认值(3000),既保证灵活性,又避免因未设环境变量导致崩溃。加载 .env 文件则让敏感配置(如数据库密码)与代码分离,符合安全规范。
模块化架构:AppModule 统领全局
NestJS 以 Module(模块) 为基本组织单元。根模块 AppModule 定义了整个应用的结构:
@Module({
imports: [TodoModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
imports:引入其他功能模块(如TodoModule),实现关注点分离;controllers:注册路由控制器,处理 HTTP 请求;providers:声明服务提供者(如AppService),供依赖注入使用。
这种声明式配置让应用结构一目了然,也便于团队协作——不同成员可并行开发独立模块,最后在根模块中集成。
控制器与服务:职责分离的典范
NestJS 遵循经典的 Controller-Service 分层模式。控制器负责处理请求与响应,服务则封装核心业务逻辑。
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('welcome')
getHello(): string {
return this.appService.getWelcome();
}
@Post('login')
login(@Body() body: { username: string; password: string }) {
const { username, password } = body;
if (!username || !password) {
return { code: 400, msg: '用户名或密码不能为空' };
}
return this.appService.handleLogin(username, password);
}
}
控制器方法通过装饰器(如 @Get、@Post)绑定路由,参数通过 @Body() 自动解析。它不直接处理登录逻辑,而是调用 AppService——这实现了关注点分离:控制器专注协议层(HTTP),服务专注业务层(验证、数据操作)。
依赖注入:自动装配的服务实例
服务类通过 @Injectable() 标记,即可被 NestJS 容器管理:
@Injectable()
export class AppService {
getWelcome(): string {
return '欢迎来到nest测试项目';
}
handleLogin(username: string, password: string) {
if (username === 'admin' && password === '123456') {
return { code: 200, msg: '登录成功' };
}
return { code: 400, msg: '用户名或密码错误' };
}
}
当 AppController 声明构造函数参数 private readonly appService: AppService 时,NestJS 会自动创建 AppService 实例并注入。这种依赖注入(DI) 机制不仅简化了对象创建,还极大提升了代码的可测试性——单元测试时可轻松替换为 Mock 服务。
类型安全:TypeScript 的核心优势
整个项目基于 TypeScript 编写,带来强类型保障:
- 路由参数
body被显式标注为{ username: string; password: string }; - 服务返回值结构清晰,避免运行时字段缺失错误;
- 编译阶段即可捕获类型不匹配问题,减少线上 bug。
例如,若在控制器中误将 body.usernmae(拼写错误)传给服务,TypeScript 会立即报错,而不是等到用户登录失败才暴露问题。
工程化体验:开箱即用的 CLI
NestJS 提供强大的命令行工具:
npm i -g @nestjs/cli
nest new nest-test-demo
一条命令即可生成标准化项目骨架,包含模块、控制器、服务模板,以及 Jest 测试、ESLint、Prettier 等工程化配置。开发者无需从零搭建,直接进入业务开发,大幅提升效率。