一、 初识Nest.js:一个渐趋流行的Node框架
Nest.js 是一个用于构建高效、可扩展的Node.js服务端应用程序的开发框架。它完全支持TypeScript,并结合了OOP(面向对象编程)、FP(函数式编程) 和 AOP(面向切面编程) 的思想。
核心优势:
- 架构清晰:深度借鉴Angular、Spring等成熟框架的设计理念,提供开箱即用的项目结构。
- 类型安全:天生支持TypeScript,提供更好的开发体验和代码维护性。
- 底层灵活:默认基于Express,但可以无缝切换至更快的Fastify。
- 依赖注入:内置强大的IoC(控制反转)容器,管理依赖关系得心应手。
对于有Angular或Spring背景的开发者来说,Nest.js会显得非常亲切。
二、 夯实基础:理解装饰器与依赖注入
在深入Nest.js之前,需要掌握两个关键的前置知识:
-
装饰器(Decorator):ES6的特性,用于增强类、方法、属性、参数的功能。Nest.js中随处可见装饰器的身影,例如
@Controller、@Get、@Injectable等。它为我们提供了一种优雅的语法来定义元数据。 -
IoC(控制反转)与DI(依赖注入):这是Nest.js的基石。
- IoC:将创建和管理对象的控制权从应用程序代码中“反转”到框架容器中。简单说,不是你主动
new一个类,而是容器帮你创建并注入。 - DI:是IoC的一种实现方式。当一个类需要另一个类的实例时,容器会自动将该实例“注入”到依赖它的类中。
- IoC:将创建和管理对象的控制权从应用程序代码中“反转”到框架容器中。简单说,不是你主动
传统方式 vs DI方式:
// 传统方式:A类内部主动创建B类实例,耦合度高
class A {
b: B;
constructor() {
this.b = new B();
}
}
// DI方式:B类实例由外部容器创建并注入A类,解耦
class A {
constructor(@Inject() private readonly b: B) {}
}
通过DI,代码的耦合度大大降低,测试和模块替换也变得异常简单。
三、 快速启航:CLI与项目结构
使用Nest CLI可以极大提升开发效率。
安装与创建项目:
npm i -g @nestjs/cli
nest new project-name
常用CLI命令:
nest generate resource [name]:快速生成一套标准的CURD模块(Controller, Service, Module等)。nest generate controller [name]:生成控制器。nest generate service [name]:生成服务。
生成的项目结构清晰明了:
src
├── app.controller.ts // 根控制器
├── app.module.ts // 根模块
├── app.service.ts // 根服务
└── main.ts // 应用入口文件
main.ts:负责创建Nest应用实例并启动服务器,类似于Vue/React的main.ts。app.module.ts:根模块,用于组织应用结构,通过@Module装饰器导入其他模块、提供者等。
四、 核心构件:控制器与提供者
-
控制器(Controller):负责处理传入的请求并返回响应。它通过装饰器来定义路由。
import { Controller, Get, Query } from '@nestjs/common'; @Controller('user') export class UserController { @Get() getUser(@Query('id') id: string): string { return `获取用户ID: ${id}`; } }@Controller('user')定义了路由前缀/user。@Get()表示处理HTTP GET请求。@Query('id')是方法参数装饰器,用于快速获取查询字符串参数,等价于req.query.id。类似的还有@Param()、@Body()等。
-
提供者(Provider):是一个广义概念,通常指通过
@Injectable装饰的类,如Service(服务)。它封装复杂的业务逻辑,供控制器调用。import { Injectable } from '@nestjs/common'; @Injectable() export class UserService { private readonly users: string[] = ['小满', 'zs']; findAll(): string[] { return this.users; } }在Module的
providers数组中声明后,就可以通过构造函数注入到控制器或其他服务中。
五、 规范接口:RESTful风格设计
Nest.js鼓励使用RESTful API设计风格,这是一种软件架构风格,而非标准。其核心是将一切视为资源,使用HTTP方法(GET, POST, PUT, DELETE等)来操作资源。
| HTTP方法 | 端点 | 描述 |
|---|---|---|
| GET | /users | 获取用户列表 |
| POST | /users | 创建新用户 |
| GET | /users/:id | 获取特定用户 |
| PUT | /users/:id | 更新特定用户 |
| DELETE | /users/:id | 删除特定用户 |
在Nest.js中,通过组合@Controller和各种HTTP方法装饰器(@Get, @Post等)可以轻松实现RESTful接口。
六、 增强功能:中间件与Session
-
中间件(Middleware):在路由处理程序之前被调用的函数。可以访问请求和响应对象,用于执行日志记录、压缩、跨域处理等任务。
Nest.js中间件可以是函数,也可以是类。类中间件需要实现
NestMiddleware接口。import { Injectable, NestMiddleware } from '@nestjs/common'; @Injectable() export class LoggerMiddleware implements NestMiddleware { use(req: any, res: any, next: () => void) { console.log('Request...', req.url); next(); // 必须调用next(),否则请求会被挂起 } }在Module中通过
configure方法注册中间件,并指定其作用的路由。 -
Session:用于在服务端存储用户会话信息。Nest.js可以无缝使用Express的中间件。
npm install express-session @types/express-session在
main.ts中注册session中间件后,就可以通过req.session来读写session,常用于用户认证。
七、 实战演练:文件上传与下载
-
文件上传:Nest.js提供了
@nestjs/platform-express和multer库来处理文件上传。- 使用
FileInterceptor拦截器(配合@UseInterceptors和@UploadedFile)来处理单个文件。 - 使用
FilesInterceptor处理多个文件。 - 可以通过
diskStorage自定义文件的存储路径和文件名。
- 使用
-
文件下载:下载文件的核心在于设置正确的HTTP响应头。
Content-Type:指定MIME类型,如application/octet-stream。Content-Disposition:设置浏览器行为,attachment; filename="file.txt"表示附件下载。
总结
通过现在的学习,我们已经搭建起了Nest.js的核心知识框架:从理念(IoC/DI) 到语法(装饰器),再到核心构件(控制器、提供者、模块) 和常用功能(中间件、会话、文件操作)。
这为后续学习更高级的特性如管道(数据验证/转换)、守卫(权限认证)、拦截器(响应格式统一) 等打下了坚实的基础。Nest.js通过这一套完整、规范的体系,让构建复杂的企业级Node.js应用变得井井有条。
参考资料:
声明:本文内容主要总结和转述自CSDN博主小满zs的Nest.js专栏,著作权归原作者所有。本文旨在学习分享,如有疑问或建议,欢迎指出。