NestJS系列(1)- nestjs简介及项目初始化

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 作为得力助手,能让你的开发过程更加流畅。

相关推荐
刘晓飞19 小时前
nestjs的类为控制器(Controller)
nestjs
前端双越老师1 天前
RAG 完全指南:从概念到生产实践
人工智能·agent·全栈
onebyte8bits1 天前
NestJS 系列教程(十五):缓存体系设计 —— Redis、接口缓存与缓存三大问题解决方案
数据库·redis·后端·缓存·nestjs
小成C2 天前
Vibe Coding 时代,研发体系该怎么重新分工
人工智能·架构·全栈
小蜜蜂dry2 天前
nestjs学习 - 中间件(Middleware)
前端·nestjs
非优秀程序员3 天前
OpenClaw 教学:25 个工具 + 53 个技能完整指南
人工智能·开源·全栈
今日无bug3 天前
Git 提交:用全栈技术打造智能 Commit Message 生成器
git·全栈
带你看月亮5 天前
为什么优秀程序员总在拆函数?因为代码应该表达意图,而不是实现
全栈
比尔盖茨的大脑5 天前
AI Agent 架构设计:从 ReAct 到 Multi-Agent 系统
前端·人工智能·全栈