NestJS 入门实战:用 TypeScript 打造你的第一个 Node.js 后端服务
所有框架的本质,都是用约定减少决策成本。
你是否曾为以下问题困扰?
- 前端用 React/Vue 写得飞快,后端却要从 Express 一行一行手写路由?
- 想用 TypeScript 写后端,但不知道怎么组织项目结构?
- 看过 Spring Boot 的模块化设计,想在 Node.js 世界里也实现“开箱即用”?
- 想一个人独立完成前后端全栈开发,却苦于找不到高效、规范的后端方案?
如果你的答案是“是”,那么今天这篇《从0死磕全栈》第8篇,就是为你准备的——
手把手教你使用 NestJS,快速搭建一个结构清晰、类型安全、企业级风格的 Node.js 后端服务。
一、什么是 NestJS?
NestJS 是一个基于 Node.js 的渐进式后端框架,由 TypeScript 构建,专为构建高效、可扩展的服务器端应用而生。
✅ 核心优势
| 特性 | 说明 |
|---|---|
| 🧩 面向对象 + 函数式编程融合 | 使用装饰器(Decorator)+ 模块化架构,类似 Java 的 Spring Boot |
| 🔧 内置依赖注入 | 自动管理服务实例,解耦组件,提升测试性 |
| 🚀 开箱即用架构 | 提供标准项目结构(Controller/Service/Module),告别“文件乱堆” |
| 💡 TypeScript 原生支持 | 完整类型推断,IDE 智能提示,杜绝运行时错误 |
| 📦 多协议支持 | 内置对 HTTP(Express/Fastify)、WebSocket、gRPC、RabbitMQ 支持 |
| 🧪 强大测试生态 | 集成 Jest,轻松编写单元测试与 E2E 测试 |
| 🔄 无缝对接 ORM | TypeORM、Prisma、Mongoose 一键集成 |
💬 一句话理解:
如果你懂 Spring Boot,那你上手 NestJS 就像回家一样自然。
如果你只会 Express,那 NestJS 就是你通往“专业后端”的升级之路。
二、动手搭建:从零创建 NestJS 项目
步骤 1:全局安装 Nest CLI 工具
npm install -g @nestjs/cli
@nestjs/cli是官方提供的命令行工具,用于快速生成项目和代码模块。
步骤 2:创建新项目
nest new my-nest-app
执行后会进入交互式配置:
选择包管理器(推荐 npm),等待安装完成。
步骤 3:打开项目目录
cd my-nest-app
code . # 使用 VSCode 打开(或其他编辑器)
三、项目结构解析:为什么说它“规范”?
NestJS 项目默认结构如下:
my-nest-app/
├── src/
│ ├── app.controller.ts # 根控制器
│ ├── app.module.ts # 根模块
│ ├── app.service.ts # 根服务
│ └── main.ts # 应用入口文件
├── test/ # 测试目录
├── nest-cli.json # CLI 配置
├── package.json
└── tsconfig.json
🔍 关键文件说明
| 文件 | 作用 |
|---|---|
main.ts | 应用启动入口,类似 Java 的 main() 方法,初始化 AppModule |
app.module.ts | 核心概念:模块(Module) —— 项目的组织单元,负责导入/导出其他模块 |
app.controller.ts | 路由处理器,定义 API 接口(如 /users) |
app.service.ts | 业务逻辑层,处理数据操作(增删改查) |
✅ NestJS 的黄金法则:
Controller 负责接收请求,Service 负责处理逻辑,Module 负责组织关系。
四、模块化开发:让代码“分而治之”
我们来创建一个用户管理模块,模拟真实的开发流程。
步骤 1:生成模块、控制器、服务
nest generate module users
nest generate controller users
nest generate service users
或简写:
nest g mo users
nest g co users
nest g s users
执行后,src/ 目录下会新增一个 users/ 文件夹:
src/
└── users/
├── users.controller.ts
├── users.module.ts
└── users.service.ts
同时,app.module.ts 会自动导入 UsersModule,无需手动配置!
步骤 2:编写 Service(业务逻辑)
// src/users/users.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class UsersService {
private users = [
{ id: 1, name: '张三', email: 'zhangsan@example.com' },
{ id: 2, name: '李四', email: 'lisi@example.com' },
];
findAll() {
return this.users;
}
create(userData: any) {
const newUser = { id: this.users.length + 1, ...userData };
this.users.push(newUser);
return newUser;
}
}
✅
@Injectable()是 NestJS 的核心装饰器,告诉框架“这个类可以被注入到其他组件中”。
步骤 3:编写 Controller(接口层)
// src/users/users.controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UsersService } from './users.service';
@Controller('users') // 基础路径:http://localhost:3000/users
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get() // GET /users
findAll() {
return this.usersService.findAll();
}
@Post() // POST /users
create(@Body() createUserDto: any) {
return this.usersService.create(createUserDto);
}
}
📌 关键装饰器详解
| 装饰器 | 用途 |
|---|---|
@Controller('users') | 定义该控制器的路由前缀 |
@Get() | 处理 GET 请求 |
@Post() | 处理 POST 请求 |
@Body() | 获取请求体中的 JSON 数据(自动反序列化) |
💡 NestJS 的智能响应机制:
当你返回一个对象(如{id: 1, name: "张三"}),NestJS 会自动将其序列化为 JSON 并设置状态码为200(POST 为201)。
不需要手动调用res.json()!
步骤 4:启动项目
npm run start
或开发模式(自动重启):
npm run start:dev
访问地址:http://localhost:3000/users
- ✅ GET 请求 → 返回所有用户列表
- ✅ POST 请求 → 使用 Postman 或 curl 添加新用户:
curl -X POST http://localhost:3000/users \
-H "Content-Type: application/json" \
-d '{"name":"王五","email":"wangwu@example.com"}'
五、为什么说 NestJS 是“优雅”的选择?
| 对比维度 | Express | NestJS |
|---|---|---|
| 项目结构 | 自由散漫,易混乱 | 强制分层,规范统一 |
| 类型安全 | 无类型,靠文档 | 全局 TypeScript,编译期校验 |
| 依赖注入 | 需手动 new 实例 | 自动注入,解耦高 |
| 测试支持 | 需自己封装 | 内置 Jest,开箱即用 |
| 学习曲线 | 简单入门 | 中等,但有 Spring 背景者秒懂 |
| 生产适用 | 小项目 | ✅ 大型项目首选 |
✅ 结论:
如果你是初学者,可以从 Express 学起;
如果你想成为专业后端开发者,NestJS 是你通往高质量工程化的必经之路。
六、结语:全栈之路,从这里开始
从前端的 React + Zustand,到后端的 NestJS + TypeORM,
你已经拥有了一个人独立完成全栈项目的能力。
- 前端负责用户体验
- 后端负责数据与逻辑
- TypeScript 统一语言,提升协作效率
真正的自由,不是选择多,而是有能力把任意选择都做得漂亮。
NestJS 不是“又一个框架”,它是现代 Node.js 开发的最佳实践集合体。
它让你不再写“胶水代码”,而是专注于业务价值本身。
📚 推荐资源
-
GitHub 示例项目:github.com/nestjs/nest
-
推荐搭配:TypeORM + PostgreSQL / MySQL(下一章详解)