NestJS 简介
NestJS 是一个用于构建高效、可扩展的 Node.js 服务端应用程序的框架。它使用 TypeScript 构建,并结合了 OOP(面向对象编程)、FP(函数式编程)和 FRP(函数式响应式编程)的元素。
核心特性
1. 架构风格 NestJS 采用模块化架构,受到 Angular 的启发,使用控制器、提供者、模块等概念来组织代码。这种结构化的设计让大型应用的维护变得异常简单。
2. 底层支持 在底层,NestJS 默认使用 Express,但同时提供了与 Fastify 的兼容性。你可以选择使用 Fastify 作为底层引擎,以获得更高的性能。
3. 内置支持
- TypeScript:原生支持,提供出色的类型安全
- 依赖注入:内置的 DI 容器,让代码更易于测试和维护
- 测试工具:提供 Jest 和 Supertest 的集成,开箱即用
- 微服务支持:内置多种传输层(TCP、Redis、MongoDB、gRPC 等)
4. 丰富的生态 NestJS 提供了大量官方模块:
@nestjs/typeorm- TypeORM 集成@nestjs/mongoose- MongoDB 集成@nestjs/graphql- GraphQL 支持@nestjs/websockets- WebSocket 网关@nestjs/swagger- OpenAPI 文档生成
环境准备
在开始之前,确保你的开发环境满足以下要求:
bash
# Node.js 版本要求
node --version # 需要 v16.x 或更高版本
# npm 版本要求
npm --version # 需要 v7.x 或更高版本
初始化 NestJS 项目
方法一:使用 Nest CLI(推荐)
1. 全局安装 Nest CLI
bash
npm install -g @nestjs/cli
# 验证安装
nest --version # 查看版本号
nest --help # 查看可用命令
2. 创建新项目
bash
# 创建项目(交互式)
nest new my-nest-project
# 或指定包管理器快速创建
nest new my-nest-project --package-manager npm
# 可选包管理器: npm, yarn, pnpm
# 或指定跳过 git 初始化和安装依赖
nest new my-nest-project --skip-git --skip-install
在创建过程中,CLI 会询问你选择包管理器,选择你习惯的工具即可。
3. 启动项目
bash
cd my-nest-project
# 开发模式启动(支持热重载)
npm run start:dev
# 或者直接启动
npm run start
访问 http://localhost:3000,你应该能看到 "Hello World!" 的欢迎页面。
方法二:使用 Git 克隆
如果你更喜欢从模板开始:
bash
# 克隆 TypeScript 起步模板
git clone https://github.com/nestjs/typescript-starter.git project-name
cd project-name
# 安装依赖
npm install
# 启动项目
npm run start:dev
项目结构解析
创建完成后,你的项目结构应该是这样的:
bash
my-nest-project/
├── src/
│ ├── main.ts # 应用程序入口文件
│ ├── app.module.ts # 根模块
│ ├── app.controller.ts # 基础控制器
│ ├── app.controller.spec.ts # 控制器单元测试
│ └── app.service.ts # 基础服务
├── test/
│ ├── app.e2e-spec.ts # e2e 测试
│ └── jest-e2e.json # e2e 测试配置
├── node_modules/
├── .eslintrc.js # ESLint 配置
├── .prettierrc # Prettier 配置
├── nest-cli.json # Nest CLI 配置
├── package.json
├── tsconfig.json # TypeScript 配置
├── tsconfig.build.json # 构建时的 TypeScript 配置
└── README.md

Nest CLI 常用命令详解
Nest CLI 提供了丰富的命令来加速开发。下面是常用的命令分类:
1. 项目管理命令
bash
# 构建项目(输出到 dist 目录)
nest build
# 构建并监控文件变化
nest build --watch
# 启动开发服务器
nest start
# 启动开发服务器(带文件监控)
nest start --watch
# 调试模式启动
nest start --debug
# 指定入口文件
nest start --entryFile server.ts
2. 代码生成命令(核心功能)
CLI 最强大的功能之一是自动生成代码文件。所有生成命令都支持 --dry-run 选项来预览将要创建的文件。
生成模块
bash
# 创建用户模块
nest generate module users
# 或简写
nest g mo users
# 在指定目录下创建模块
nest g mo modules/users
# 创建模块时不生成测试文件
nest g mo users --no-spec
生成控制器
bash
# 创建用户控制器
nest generate controller users
# 或简写
nest g co users
# 创建空控制器(不生成 CRUD 方法)
nest g co users --flat
# 指定控制器版本
nest g co users/v1 --flat
生成服务
bash
# 创建用户服务
nest generate service users
# 或简写
nest g s users
# 创建服务并指定作用域
nest g s users --scope=REQUEST # 请求作用域
生成完整的资源(最常用)
bash
# 创建完整的 CRUD 资源(包含模块、控制器、服务、DTO、实体)
nest generate resource users
# 或简写
nest g res users
# 选择传输层(REST API / GraphQL / 微服务 / WebSocket)
# 选择是否生成 CRUD 入口点
执行这个命令后,CLI 会进入交互模式,询问:
- 选择传输层(REST API、GraphQL、微服务、WebSocket)
- 是否生成 CRUD 代码
选择 REST API 并确认生成 CRUD,CLI 会自动创建:
- 用户模块
- 控制器(包含 CRUD 方法)
- 服务(包含业务逻辑)
- DTO 文件(CreateUserDto, UpdateUserDto)
- 实体文件(User)
- 测试文件
3. 其他代码生成
bash
# 生成中间件
nest generate middleware logger
# 生成过滤器
nest generate filter http-exception
# 生成管道
nest generate pipe validation
# 生成守卫
nest generate guard auth
# 生成拦截器
nest generate interceptor transform
# 生成装饰器
nest generate decorator user
# 生成接口
nest generate interface user
4. 信息查看命令
bash
# 查看项目信息(版本、依赖等)
nest info
# 查看 CLI 帮助
nest --help
# 查看特定命令的帮助
nest generate --help
快速创建一个 REST API 示例
让我们通过一个实际例子来体验 Nest CLI 的效率:
步骤 1:创建项目
bash
nest new todo-api
cd todo-api
步骤 2:生成 Todo 资源
bash
nest g res todos
选择 REST API,选择生成 CRUD。
步骤 3:查看生成的文件结构
lua
src/todos/
├── dto/
│ ├── create-todo.dto.ts
│ └── update-todo.dto.ts
├── entities/
│ └── todo.entity.ts
├── todos.controller.ts
├── todos.controller.spec.ts
├── todos.module.ts
├── todos.service.ts
└── todos.service.spec.ts
步骤 4:简化实体和 DTO
修改 src/todos/entities/todo.entity.ts:
typescript
export class Todo {
id: number;
title: string;
description?: string;
completed: boolean;
createdAt: Date;
}
修改 src/todos/dto/create-todo.dto.ts:
typescript
export class CreateTodoDto {
title: string;
description?: string;
}
步骤 5:实现服务逻辑
修改 src/todos/todos.service.ts:
typescript
import { Injectable } from '@nestjs/common';
import { CreateTodoDto } from './dto/create-todo.dto';
import { UpdateTodoDto } from './dto/update-todo.dto';
import { Todo } from './entities/todo.entity';
@Injectable()
export class TodosService {
private todos: Todo[] = [
{ id: 1, title: '学习 NestJS', description: '掌握 CLI 使用', completed: false, createdAt: new Date() }
];
private idCounter = 2;
create(createTodoDto: CreateTodoDto) {
const newTodo: Todo = {
id: this.idCounter++,
...createTodoDto,
completed: false,
createdAt: new Date()
};
this.todos.push(newTodo);
return newTodo;
}
findAll() {
return this.todos;
}
findOne(id: number) {
return this.todos.find(todo => todo.id === id);
}
update(id: number, updateTodoDto: UpdateTodoDto) {
const todo = this.findOne(id);
if (todo) {
Object.assign(todo, updateTodoDto);
}
return todo;
}
remove(id: number) {
const index = this.todos.findIndex(todo => todo.id === id);
if (index > -1) {
this.todos.splice(index, 1);
}
return { deleted: true };
}
}
步骤 6:启动并测试
bash
npm run start:dev
现在你可以通过以下端点测试 API:
- GET
http://localhost:3000/todos- 获取所有 Todo - GET
http://localhost:3000/todos/1- 获取 ID 为 1 的 Todo - POST
http://localhost:3000/todos- 创建新 Todo - PATCH
http://localhost:3000/todos/1- 更新 Todo - DELETE
http://localhost:3000/todos/1- 删除 Todo
总结
NestJS 通过提供结构化的架构和强大的 CLI 工具,极大地提升了 Node.js 后端开发的效率和体验。核心要点:
- 模块化设计让代码组织更清晰
- 依赖注入让测试和维护更简单
- CLI 工具自动化生成代码,减少重复工作
- 丰富的生态满足各种业务需求
无论你是正在构建 REST API、GraphQL 服务,还是复杂的微服务架构,NestJS 都能提供良好的支持。而 Nest CLI 作为得力助手,能让你的开发过程更加流畅。