快速上手Nest.js:掌握装饰器、依赖注入与RESTful API开发

4 阅读5分钟

一、 初识Nest.js:一个渐趋流行的Node框架

​Nest.js​​ 是一个用于构建高效、可扩展的Node.js服务端应用程序的开发框架。它完全支持TypeScript,并结合了​​OOP(面向对象编程)​​、​​FP(函数式编程)​​ 和 ​​AOP(面向切面编程)​​ 的思想。

​核心优势:​

  • ​架构清晰​​:深度借鉴Angular、Spring等成熟框架的设计理念,提供开箱即用的项目结构。
  • ​类型安全​​:天生支持TypeScript,提供更好的开发体验和代码维护性。
  • ​底层灵活​​:默认基于Express,但可以无缝切换至更快的Fastify。
  • ​依赖注入​​:内置强大的IoC(控制反转)容器,管理依赖关系得心应手。

对于有Angular或Spring背景的开发者来说,Nest.js会显得非常亲切。

二、 夯实基础:理解装饰器与依赖注入

在深入Nest.js之前,需要掌握两个关键的前置知识:

  1. ​装饰器(Decorator)​​:ES6的特性,用于增强类、方法、属性、参数的功能。Nest.js中随处可见装饰器的身影,例如@Controller@Get@Injectable等。它为我们提供了一种优雅的语法来定义元数据。

  2. ​IoC(控制反转)与DI(依赖注入)​​:这是Nest.js的基石。

    • ​IoC​​:将创建和管理对象的控制权从应用程序代码中“反转”到框架容器中。简单说,不是你主动new一个类,而是容器帮你创建并注入。
    • ​DI​​:是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装饰器导入其他模块、提供者等。

四、 核心构件:控制器与提供者

  1. ​控制器(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()等。
  2. ​提供者(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

  1. ​中间件(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方法注册中间件,并指定其作用的路由。

  2. ​Session​​:用于在服务端存储用户会话信息。Nest.js可以无缝使用Express的中间件。

    npm install express-session @types/express-session
    

    main.ts中注册session中间件后,就可以通过req.session来读写session,常用于用户认证。

七、 实战演练:文件上传与下载

  1. ​文件上传​​:Nest.js提供了@nestjs/platform-expressmulter库来处理文件上传。

    • 使用FileInterceptor拦截器(配合@UseInterceptors@UploadedFile)来处理单个文件。
    • 使用FilesInterceptor处理多个文件。
    • 可以通过diskStorage自定义文件的存储路径和文件名。
  2. ​文件下载​​:下载文件的核心在于设置正确的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专栏,著作权归原作者所有。本文旨在学习分享,如有疑问或建议,欢迎指出。