:从零搭建你的第一个企业级Node.js后端项目)
全网最硬核NestJS实战手册一从零搭建你的第一个企业级Node.js后端项目一、NestJS 是什么NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用程序的渐进式框架。它完全基于 TypeScript 构建同时兼容纯 JavaScript 开发融合了面向对象编程OOP、函数式编程FP和函数响应式编程FRP的设计理念。在底层NestJS 默认使用 Express 作为 HTTP 服务器框架同时可选配置为 Fastify。开发者在上层享受 NestJS 提供的架构抽象的同时仍然可以直接访问底层框架的原生 API使用其丰富的第三方中间件生态。为什么选择 NestJSNode.js 生态中不乏优秀的 Web 框架Express、Koa、Fastify 等但它们都没有系统性地解决应用架构这一核心问题。NestJS 的核心价值在于提供开箱即用的应用架构帮助团队构建高度可测试、可扩展、松耦合、易于维护的应用程序。其架构设计深受 Angular 的影响对于有 Angular 经验的开发者来说上手极为顺畅。技术栈速览维度说明语言TypeScript首选/ JavaScript运行时Node.js 20底层 HTTPExpress默认/ Fastify设计范式OOP FP FRP核心理念模块化、依赖注入、装饰器驱动适用场景REST API、GraphQL、微服务、WebSocket、消息队列二、环境准备与第一个项目前置要求确保操作系统已安装 Node.js版本 20通过以下命令验证node -v npm -v使用 Nest CLI 创建项目Nest CLI 是官方推荐的脚手架工具npm i -g nestjs/cli nest new nest-demo执行后会生成如下目录结构src/ app.controller.spec.ts # 控制器的单元测试 app.controller.ts # 基础控制器含单个路由 app.module.ts # 应用根模块 app.service.ts # 基础服务含单个方法 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(process.env.PORT ?? 3000); } bootstrap();NestFactory是创建 Nest 应用实例的核心工厂类其create()方法返回实现了INestApplication接口的对象。如需调用底层平台 API如 Express 特定方法可指定泛型类型const app await NestFactory.createNestExpressApplication(AppModule);运行与热重载# 开发模式文件变更自动重启 npm run start:dev # 生产构建 npm run build npm run start:prod启动后访问http://localhost:3000/页面将显示Hello World!。三、Controller请求的入口控制器负责处理传入的 HTTP 请求并将响应返回给客户端。每个 Controller 通过Controller()装饰器定义路由前缀内部方法通过 HTTP 方法装饰器Get、Post等标记。基础路由import { Controller, Get, Post, Body, Param, Query } from nestjs/common; Controller(cats) export class CatsController { Get() findAll(Query(breed) breed?: string): string { return This action returns all cats, breed filter: ${breed}; } Get(:id) findOne(Param(id) id: string): string { return This action returns cat #${id}; } Post() create(Body() createCatDto: CreateCatDto): string { return This action adds a new cat; } }常用参数装饰器装饰器作用示例Param(key?)获取路由参数Param(id) id: stringQuery(key?)获取查询参数Query(page) page: numberBody(key?)获取请求体Body() dto: CreateDtoHeaders(key?)获取请求头Headers(authorization) tokenReq()获取完整请求对象直接访问 Express RequestRes()获取完整响应对象直接访问 Express Response状态码与响应头Post() HttpCode(201) Header(Cache-Control, none) create(Body() createCatDto: CreateCatDto) { return this.catsService.create(createCatDto); }四、Provider 与依赖注入Provider 是 NestJS 中的基础概念包括 Service、Repository、Factory、Helper 等。通过Injectable()装饰器标记由 Nest 的 IoC 容器统一管理生命周期和依赖关系。创建 Service// cats.service.ts import { Injectable } from nestjs/common; Injectable() export class CatsService { private readonly cats: Cat[] []; findAll(): Cat[] { return this.cats; } create(cat: Cat) { this.cats.push(cat); } }构造函数注入在 Module 中注册 Provider 后即可通过构造函数注入到 ControllerController(cats) export class CatsController { constructor(private readonly catsService: CatsService) {} Get() findAll(): Cat[] { return this.catsService.findAll(); } }private readonly是 TypeScript 的简写语法既声明了私有只读属性又完成了参数赋值无需手动写this.catsService catsService。依赖注入的三种作用域默认情况下Provider 是单例Singleton整个应用共享同一实例。NestJS 还支持Request scope每个请求创建一个新实例Transient scope每次注入创建一个新实例Injectable({ scope: Scope.REQUEST }) export class CatsService {}大多数场景使用默认单例即可仅在需要请求级上下文如请求 ID 追踪时才考虑请求作用域。五、Module组织的基石Module 是组织应用代码的基本单元。每个 Nest 应用至少有一个根模块AppModule复杂应用按业务领域拆分为多个功能模块。模块定义import { Module } from nestjs/common; Module({ imports: [CatsModule, DogsModule], // 导入其他模块 controllers: [AppController], // 注册控制器 providers: [AppService], // 注册提供者 exports: [AppService], // 导出供其他模块使用 }) export class AppModule {}模块的四个核心属性属性说明imports导入其他模块使其导出的 Provider 在当前模块可用controllers注册属于该模块的控制器providers注册属于该模块的提供者Service 等exports将当前模块的 Provider 导出供其他导入该模块的地方使用功能模块封装典型的功能模块结构// cats.module.ts Module({ controllers: [CatsController], providers: [CatsService], exports: [CatsService], // 如果其他模块需要使用 CatsService }) export class CatsModule {}模块之间的依赖关系通过imports和exports建立形成清晰的模块依赖图。全局模块使用Global()装饰器可将模块注册为全局模块被全局模块导出的 Provider 无需在各处imports即可直接注入Global() Module({ providers: [PrismaService], exports: [PrismaService], }) export class DatabaseModule {}全局模块应谨慎使用通常仅用于数据库连接、配置管理等基础设施模块。过度使用会破坏模块边界的清晰性。六、小结与下一步本篇覆盖了 NestJS 最核心的三大概念Controller处理 HTTP 请求定义路由和响应Provider / DI通过依赖注入实现松耦合IoC 容器自动管理依赖Module模块化组织代码控制可见性和依赖关系这三个概念构成了 NestJS 应用的骨架。下一篇将深入中间件、异常过滤器、管道、守卫、拦截器等请求管线组件以及数据持久化和认证授权的实现。幸得你于纷扰时光里驻足品读由衷致谢Thank you for watching in your busy schedule. Thank you. 时代变了开发者的武器也该换了关注我主页解锁更多 AI 落地实战与前沿技术。带你打破行业内卷快速从普通开发者进阶为新时代 AI 程序工程师✨ 别在旧世界里打转一起去新世界探险。