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

74 阅读6分钟

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 文档生成

环境准备

在开始之前,确保你的开发环境满足以下要求:

# Node.js 版本要求
node --version  # 需要 v16.x 或更高版本

# npm 版本要求
npm --version   # 需要 v7.x 或更高版本

初始化 NestJS 项目

方法一:使用 Nest CLI(推荐)

1. 全局安装 Nest CLI

npm install -g @nestjs/cli

# 验证安装
nest --version  # 查看版本号
nest --help     # 查看可用命令

2. 创建新项目

# 创建项目(交互式)
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. 启动项目

cd my-nest-project

# 开发模式启动(支持热重载)
npm run start:dev

# 或者直接启动
npm run start

访问 http://localhost:3000,你应该能看到 "Hello World!" 的欢迎页面。

方法二:使用 Git 克隆

如果你更喜欢从模板开始:

# 克隆 TypeScript 起步模板
git clone https://github.com/nestjs/typescript-starter.git project-name
cd project-name

# 安装依赖
npm install

# 启动项目
npm run start:dev

项目结构解析

创建完成后,你的项目结构应该是这样的:

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

image.png

Nest CLI 常用命令详解

Nest CLI 提供了丰富的命令来加速开发。下面是常用的命令分类:

1. 项目管理命令

# 构建项目(输出到 dist 目录)
nest build

# 构建并监控文件变化
nest build --watch

# 启动开发服务器
nest start

# 启动开发服务器(带文件监控)
nest start --watch

# 调试模式启动
nest start --debug

# 指定入口文件
nest start --entryFile server.ts

2. 代码生成命令(核心功能)

CLI 最强大的功能之一是自动生成代码文件。所有生成命令都支持 --dry-run 选项来预览将要创建的文件。

生成模块

# 创建用户模块
nest generate module users
# 或简写
nest g mo users

# 在指定目录下创建模块
nest g mo modules/users

# 创建模块时不生成测试文件
nest g mo users --no-spec

生成控制器

# 创建用户控制器
nest generate controller users
# 或简写
nest g co users

# 创建空控制器(不生成 CRUD 方法)
nest g co users --flat

# 指定控制器版本
nest g co users/v1 --flat

生成服务

# 创建用户服务
nest generate service users
# 或简写
nest g s users

# 创建服务并指定作用域
nest g s users --scope=REQUEST  # 请求作用域

生成完整的资源(最常用)

# 创建完整的 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. 其他代码生成

# 生成中间件
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. 信息查看命令

# 查看项目信息(版本、依赖等)
nest info

# 查看 CLI 帮助
nest --help

# 查看特定命令的帮助
nest generate --help

快速创建一个 REST API 示例

让我们通过一个实际例子来体验 Nest CLI 的效率:

步骤 1:创建项目

nest new todo-api
cd todo-api

步骤 2:生成 Todo 资源

nest g res todos

选择 REST API,选择生成 CRUD。

步骤 3:查看生成的文件结构

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

export class Todo {
  id: number;
  title: string;
  description?: string;
  completed: boolean;
  createdAt: Date;
}

修改 src/todos/dto/create-todo.dto.ts

export class CreateTodoDto {
  title: string;
  description?: string;
}

步骤 5:实现服务逻辑

修改 src/todos/todos.service.ts

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:启动并测试

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