NestJS 搭建博客系统(一)— 搭建框架

 NestJS 搭建博客系统(一)— 搭建框架

NestJS 搭建博客系统(一)— 搭建框架

前言

本系列主要面向没接触过后端开发或想接触下后端开发的同学,通过一个小项目,了解下后端开发的一些基本知识。

简介

本章主要介绍 NestJS 这个框架以及搭建项目的基本步骤。

关于 NestJS

Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人员使用纯 JavaScript 编写代码)并结合了 OOP(面向对象编程),FP(函数式编程)和 FRP(函数式响应编程)的元素。

总体来讲当前比较流行的 NodeJS 服务端框架主要有 express、koa、fastify、Hapi、NestJS、egg、Midway 等框架。 作为 NodeJS 进军服务端领域的开山之作 express 有着相当丰富的插件生态,但也由于其本身的定位并不是框架,所以 express 的开发风格非常自由。 Koa 作为 express 原班人马的又一力作,使用 async、await 处理异步,在几年前可以说是福音般的存在,时隔几年,async await 已经家喻户晓。 NestJS 本身默认使用 express 作为底层框架,也就是说 NestJS 是一个上层框架,在使用 express 作为底层框架时,可以使用所有 express 支持的插件库,同时还提供了 fastify 作为底层库。 Fastify、Hapi 等由于本人还没使用过,所以暂不具体展开,不过 fastify 提供的 fast-json-stringify 比 JSON.stringify() 更快这个实现也是很吸引人的。 egg、Midway 是阿里巴巴出品的 NodeJS 框架,egg 基于 koa2,使用约定大于配置的方式开发,Midway更是可以理解为egg的上层框架,相比于Nest,同样支持 IoC 等功能。

选择 NestJS 是由于之前也有触过express、koa、egg等框架,后来为了上 TS 也折腾了好久,而就在折腾 TS 的时候,发现了 Midway 和 NestJS,而选择了后者的主要理由是 NestJS 没什么历史包袱,甚至被誉为 NodeJS 版本的 Spring,在看过中文网的描述后发现中文网和原官网几乎一样,所以毫不犹豫的选择了后者。

当然,以上说了一大堆都还是局限在 JS、TS 这种语言上,而市场上最受欢迎的后端语言仍然是 PHP、JAVA 等语言。如果有想更深入学习后端知识,建议从这两个语言入手。

初始化项目

项目环境

  • node v14.17.0
  • npm 6.14.0

按照官网,我们先安装全局脚手架 NEST CLI

npm i -g @nestjs/cli
复制代码

初始化项目

nest new blog-serve
复制代码

进入项目目录并安装依赖

cd blog-serve

yarn install
复制代码

此时我们得到了一个结构目录如下的项目

.
├── README.md
├── nest-cli.json
├── package.json       
├── src
│   ├── app.controller.spec.ts  // 控制器测试
│   ├── app.controller.ts       // 控制器
│   ├── app.module.ts           // 模块
│   ├── app.service.ts          // 服务
│   └── main.ts                 // 入口文件
├── test
│   ├── app.e2e-spec.ts
│   └── jest-e2e.json
├── tsconfig.build.json
├── tsconfig.json
└── yarn.lock
复制代码

执行

npm run start:dev
复制代码

运行代码,打开浏览器,输入 localhost:3000

跟其他 NodeJS 不一样的是, NestJS 的路由 由 控制器负责,也就是说我们不再需要写一个路由文件了。 而同时有一个模块的概念,后续我们也会以模块的形式去开发,比如文章模块,标签模块,图床模块,用户模块等。

基本概念

NestJS 请求生命周期

关于 NestJS 的请求生命周期是这样的:

1. 收到请求

2. 全局绑定的中间件
3. 模块绑定的中间件

4. 全局守卫
5. 控制层守卫
6. 路由守卫

7. 全局拦截器(控制器之前)
8. 控制器层拦截器 (控制器之前)
9. 路由拦截器 (控制器之前)

10. 全局管道
11. 控制器管道
12. 路由管道
13. 路由参数管道

14. 控制器(方法处理器) 

15. 服务(如果有)

16. 路由拦截器(请求之后)
17. 控制器拦截器 (请求之后)
18. 全局拦截器 (请求之后)

19. 异常过滤器 (路由,之后是控制器,之后是全局)

20. 服务器响应
复制代码

除了异常过滤器和拦截器(请求后)是由 路由->控制器->全局 之外,中间间、守卫、拦截器(请求前)、管道都是从 全局->控制器->路由 的顺序执行

中间件

中间件是在路由处理程序 之前 调用的函数。 中间件函数可以访问请求和响应对象,以及应用程序请求响应周期中的 next() 中间件函数。 next() 中间件函数通常由名为 next 的变量表示。 中间件 中间件函数可以执行以下任务:

  • 执行任何代码。
  • 对请求和响应对象进行更改。
  • 结束请求-响应周期。
  • 调用堆栈中的下一个中间件函数。
  • 如果当前的中间件函数没有结束请求-响应周期, 它必须调用 next() 将控制传递给下一个中间件函数。否则, 请求将被挂起。

守卫

守卫是一个使用 @Injectable() 装饰器的类。 守卫应该实现 CanActivate 接口。 守卫 守卫有一个单独的责任。它们根据运行时出现的某些条件(例如权限,角色,访问控制列表等)来确定给定的请求是否由路由处理程序处理。 这通常称为授权。在传统的 Express 应用程序中,通常由中间件处理授权。中间件是身份验证的良好选择。到目前为止,访问限制逻辑大多在中间件内。这样很好,因为诸如 token 验证或将 request 对象附加属性与特定路由没有强关联。

中间件不知道调用 next() 函数后会执行哪个处理程序。另一方面,警卫可以访问 ExecutionContext 实例,因此确切地知道接下来要执行什么。它们的设计与异常过滤器、管道和拦截器非常相似,目的是让您在请求/响应周期的正确位置插入处理逻辑,并以声明的方式进行插入。这有助于保持代码的简洁和声明性。

拦截器

拦截器是使用 @Injectable() 装饰器注解的类。拦截器应该实现 NestInterceptor 接口。 拦截器

管道

管道是具有 @Injectable() 装饰器的类。管道应实现 PipeTransform 接口。 管道

管道有两个类型:

转换:管道将输入数据转换为所需的数据输出 验证:对输入数据进行验证,如果验证成功继续传递; 验证失败则抛出异常;

在这两种情况下, 管道 参数(arguments) 会由 控制器(controllers)的路由处理程序 进行处理. Nest 会在调用这个方法之前插入一个管道,管道会先拦截方法的调用参数,进行转换或是验证处理,然后用转换好或是验证好的参数调用原方法。

控制器

控制器负责处理传入的请求和向客户端返回响应。 控制器 控制器的目的是接收应用的特定请求。路由机制控制哪个控制器接收哪些请求。通常,每个控制器有多个路由,不同的路由可以执行不同的操作。

为了创建一个基本的控制器,我们使用类和装饰器。装饰器将类与所需的元数据相关联,并使 Nest 能够创建路由映射(将请求绑定到相应的控制器)。

提供者

Providers 是 Nest 的一个基本概念。许多基本的 Nest 类可能被视为 provider - service, repository, factory, helper 等等。 他们都可以通过 constructor 注入依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。 Provider 只是一个用 @Injectable() 装饰器注释的类。

提供者

异常过滤器

内置的异常层负责处理整个应用程序中的所有抛出的异常。当捕获到未处理的异常时,最终用户将收到友好的响应。 异常过滤器

参考

分类:
前端
标签: