NestJS 是一个用于构建高效、可伸缩的 Node.js 服务器端应用的框架。它使用了渐进式的 JavaScript (以及完全支持 TypeScript) 并结合了面向对象编程 (OOP)、函数式编程 (FP) 和响应式编程 (RP) 的元素。NestJS 受 Angular 框架启发很大,引入了模块、控制器、服务(提供者)、依赖注入等概念,为 Node.js 应用提供了一个开箱即用的、良好定义的架构。
为什么选择 NestJS?
- 提供了良好的架构模式: NestJS 强制或鼓励你遵循模块化、分层设计的原则,这解决了纯 Node.js 或 Express 项目在规模增大后代码变得混乱的问题。就像中央厨房有明确的区域划分(冷菜区、热菜区、甜点区)。
- 基于 TypeScript 构建: 默认使用 TypeScript,让你在后端开发中也能享受到静态类型带来的安全性和开发效率提升。整个厨房的配料、工具都有明确的标签和用途说明。
- 开箱即用: 内置了许多常用的功能和工具,比如配置管理、验证、日志、ORM/ODM 集成等,减少了你需要手动集成第三方库的工作量。厨房里各种自动化设备和标准工具已经配齐。
- 强大的 CLI 工具: Nest CLI (Command Line Interface) 是一个命令行工具,可以快速生成各种 NestJS 项目文件(模块、控制器、服务等),大大提高了开发效率。就像拥有了一套快速搭建标准厨房工位的工具。
- 良好的生态系统: NestJS 社区活跃,有丰富的文档和第三方模块。
Node.js 版本要求:
NestJS 通常要求较新版本的 Node.js。在开始之前,请确保你的 Node.js 版本符合 NestJS 的要求(通常是 10.13.0 或更高版本)。你可以运行 node -v
来检查版本。
安装 Nest CLI:
Nest CLI 是我们创建和管理 NestJS 项目的主要工具。通过 npm 或 yarn 全局安装它:
npm install -g @nestjs/cli
# 或者使用 yarn
# yarn global add @nestjs/cli
安装完成后,你就可以在终端使用 nest
命令了。
创建第一个 NestJS 项目:
使用 Nest CLI 创建一个新项目非常简单:
nest new my-nestjs-app
CLI 会询问你使用 npm 还是 yarn 作为包管理器。选择一个后,CLI 会自动创建一个新的项目目录 my-nestjs-app
,下载所有必需的依赖,并生成项目的基本结构。
创建完成后,进入项目目录:
cd my-nestjs-app
启动应用:
npm run start:dev
# 或者 yarn start:dev
这会启动一个开发服务器,通常在 http://localhost:3000
。在浏览器中访问这个地址,你会看到 “Hello World!”。
项目结构概览:
使用 CLI 创建的项目会生成以下主要文件和目录:
my-nestjs-app/
├── src/ // 源代码目录
│ ├── app.controller.spec.ts // 根控制器单元测试文件
│ ├── app.controller.ts // 根控制器 - 处理基本请求
│ ├── app.module.ts // 根模块 - 组织应用的基本单元
│ ├── app.service.ts // 根服务 (提供者) - 处理业务逻辑
│ └── main.ts // 应用的入口文件 - 启动 NestJS 应用
├── test/ // 端到端测试目录
├── .eslintrc.js // ESLint 配置
├── .gitignore // Git 忽略文件
├── .prettierrc // Prettier 配置
├── nest-cli.json // Nest CLI 配置
├── package.json // 项目配置和依赖
├── README.md // 项目说明
└── tsconfig.json // TypeScript 配置
main.ts
: 应用的入口点,使用NestFactory.create()
创建应用实例并监听端口。app.module.ts
: 根模块 (AppModule
)。模块是组织应用的基本单位,它定义了应用的不同部分(控制器、提供者)以及它们之间的关系。app.controller.ts
: 根控制器 (AppController
)。控制器负责处理进来的请求并返回响应。app.service.ts
: 根服务 (AppService
)。服务通常用于处理业务逻辑、数据访问等。
小例子:探索默认项目
打开 src/app.controller.ts
,你会看到一个简单的控制器:
// src/app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller() // 控制器装饰器,可以指定路由前缀,这里没有指定
export class AppController {
constructor(private readonly appService: AppService) {} // 通过构造函数注入 AppService
@Get() // HTTP 方法装饰器,处理 GET 请求到根路径
getHello(): string {
return this.appService.getHello(); // 调用 Service 的方法
}
}
打开 src/app.service.ts
:
// src/app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable() // 标记为一个可注入的提供者
export class AppService {
getHello(): string {
return 'Hello World!'; // 简单的业务逻辑
}
}
这里已经展示了 NestJS 的核心概念:
- 装饰器 (
@Controller
,@Get
,@Injectable
): 用于为类或方法添加元数据,告诉 NestJS 它们扮演什么角色。 - 依赖注入 (DI): 在
AppController
的构造函数中,NestJS 自动提供了AppService
的实例。控制器不需要知道如何创建AppService
,只需要声明它需要一个AppService
,NestJS 会负责“注入”进来。
小结: NestJS 是一个提供良好架构和开发模式的 Node.js 框架,特别适合构建大型应用。Nest CLI 是快速创建和管理项目的利器。NestJS 项目由模块、控制器、服务等核心构建块组成,并广泛使用装饰器和依赖注入。
练习:
- 使用 Nest CLI 创建一个新的 NestJS 项目,命名为
my-backend
。 - 进入项目目录,运行
npm run start:dev
或yarn start:dev
启动应用,并在浏览器中访问确认。 - 打开
src/app.service.ts
,修改getHello()
方法,返回一个不同的字符串,比如 “欢迎来到我的 NestJS 应用!”。 - 保存文件,由于
start:dev
使用了文件监听,应用会自动重启。刷新浏览器,确认修改生效。